From c15fce095b74d2253354e87f39ba2ee962f87d21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Max=20Beb=C3=B6k?= Date: Thu, 22 Jun 2023 20:10:31 +0200 Subject: [PATCH 01/74] fix: scene table, handle empty lines and comments --- fast64_internal/oot/scene/exporter/to_c/scene_table_c.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/fast64_internal/oot/scene/exporter/to_c/scene_table_c.py b/fast64_internal/oot/scene/exporter/to_c/scene_table_c.py index 67bf6a7..48f2da1 100644 --- a/fast64_internal/oot/scene/exporter/to_c/scene_table_c.py +++ b/fast64_internal/oot/scene/exporter/to_c/scene_table_c.py @@ -32,10 +32,13 @@ def getSceneTable(exportPath): with open(os.path.join(exportPath, "include/tables/scene_table.h")) as fileData: # keep the relevant data and do some formatting for i, line in enumerate(fileData): + if not line.strip(): + continue + if not bpy.context.scene.fast64.oot.hackerFeaturesEnabled or getHackerOoTCheck(line): - if not (line.startswith("/**") or line.startswith(" *")): + if not (line.startswith("/**") or line.startswith(" *") or line.startswith("//")): dataList.append(line[(line.find("(") + 1) :].rstrip(")\n").replace(" ", "").split(",")) - else: + elif not dataList: # only keep comments before data to avoid duplication on save fileHeader += line if line.startswith("/* 0x"): startIndex = line.find("SCENE_") From d29d8fee2c781084fe1fc4dd229273665fbf8449 Mon Sep 17 00:00:00 2001 From: Dragorn421 Date: Thu, 22 Jun 2023 22:20:26 +0200 Subject: [PATCH 02/74] Some comments on scene table reading --- .../oot/scene/exporter/to_c/scene_table_c.py | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/fast64_internal/oot/scene/exporter/to_c/scene_table_c.py b/fast64_internal/oot/scene/exporter/to_c/scene_table_c.py index 48f2da1..d1d18b8 100644 --- a/fast64_internal/oot/scene/exporter/to_c/scene_table_c.py +++ b/fast64_internal/oot/scene/exporter/to_c/scene_table_c.py @@ -32,14 +32,26 @@ def getSceneTable(exportPath): with open(os.path.join(exportPath, "include/tables/scene_table.h")) as fileData: # keep the relevant data and do some formatting for i, line in enumerate(fileData): + # remove empty lines from the file if not line.strip(): continue if not bpy.context.scene.fast64.oot.hackerFeaturesEnabled or getHackerOoTCheck(line): - if not (line.startswith("/**") or line.startswith(" *") or line.startswith("//")): + if not ( + # Detects the multiline comment at the top of the file: + (line.startswith("/**") or line.startswith(" *")) + # Detects single line comments: + # (meant to detect the built-in single-line comments + # "// Debug-only scenes" and "// Added scenes") + or line.startswith("//") + ): dataList.append(line[(line.find("(") + 1) :].rstrip(")\n").replace(" ", "").split(",")) - elif not dataList: # only keep comments before data to avoid duplication on save - fileHeader += line + else: + # Only keep comments before the data (as indicated by dataList being empty). + # This prevents duplicating the built-in single-line comments to the header. + # It also means other handwritten single-line comments are removed from the file. + if not dataList: + fileHeader += line if line.startswith("/* 0x"): startIndex = line.find("SCENE_") sceneNames.append(line[startIndex : line.find(",", startIndex)]) From d6aeb6c1e80fe1b494356fd455e92e7d2aa090f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Max=20Beb=C3=B6k?= Date: Tue, 4 Jul 2023 14:30:59 +0200 Subject: [PATCH 03/74] new: basic MM XML, fix oot unicode chars --- fast64_internal/mm/data/xml/ActorList.xml | 694 +++++++++++++++++++++ fast64_internal/oot/data/xml/ActorList.xml | 190 +++--- 2 files changed, 790 insertions(+), 94 deletions(-) create mode 100644 fast64_internal/mm/data/xml/ActorList.xml diff --git a/fast64_internal/mm/data/xml/ActorList.xml b/fast64_internal/mm/data/xml/ActorList.xml new file mode 100644 index 0000000..ac0e6fa --- /dev/null +++ b/fast64_internal/mm/data/xml/ActorList.xml @@ -0,0 +1,694 @@ + + + + + + + + + + + + + + + + + + + + + Regular + Large + + + + + + + + + + + + + + + + + + + + + + + + + + Default + Invisible + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/fast64_internal/oot/data/xml/ActorList.xml b/fast64_internal/oot/data/xml/ActorList.xml index efcdad7..105af18 100644 --- a/fast64_internal/oot/data/xml/ActorList.xml +++ b/fast64_internal/oot/data/xml/ActorList.xml @@ -129,7 +129,7 @@ for each sub element (of ) mentioned below: Large Large, Appears, Clear Flag - Boss Key’s Chest + Boss Key's Chest Large, Falling, Switch Flag Large, Invisible Small @@ -489,16 +489,16 @@ Depending on the scene ID, they need certain objects loaded as the first one in Waterfall Small Stream Stream - Fire Temple’s Lower Ambient Noise - Fire Temple’s Higher Ambient Noise + Fire Temple's Lower Ambient Noise + Fire Temple's Higher Ambient Noise Water Dripping (Well) River Market gibberish Decrease current BGM volume - Proximity Saria’s Song + Proximity Saria's Song Howling wind Gurgling - Temple of Light’s dripping sounds + Temple of Light's dripping sounds Low booming-likish sound Quake/Collapse Fairy Fountain @@ -911,7 +911,7 @@ ZROT 0x00FF = Gold Skulltula spawn var high byte (See Gold Skulltula Actor 0095) Normal, flashes blue when struck with sword - Frickin’ huge, doesn’t flash when struck + Frickin' huge, doesn't flash when struck Even bigger? Ridiculously huge? Small size, flashes blue when struck @@ -931,12 +931,12 @@ ZROT 0x00FF = Gold Skulltula spawn var high byte (See Gold Skulltula Actor 0095) Line Loop Circle Loop - - - - - - + + + + + + @@ -1216,7 +1216,7 @@ ZROT 0x00FF = Gold Skulltula spawn var high byte (See Gold Skulltula Actor 0095) Blue Warp and Ruto Leaning Ruto //no collision data, targetable - Ruto, First Encounter //Plays cutscene from Jabu-Jabu’s Belly when you first meet her + Ruto, First Encounter //Plays cutscene from Jabu-Jabu's Belly when you first meet her Ruto, after falling down the hole in Jabu-Jabu @@ -1224,8 +1224,8 @@ ZROT 0x00FF = Gold Skulltula spawn var high byte (See Gold Skulltula Actor 0095) - Flies, lands, dies in a bit //try not to run into it, Link’ll catch on fire - Flies, lands, creeps towards Link, dies in a bit //it’s blue, but it’s still fire + Flies, lands, dies in a bit //try not to run into it, Link'll catch on fire + Flies, lands, creeps towards Link, dies in a bit //it's blue, but it's still fire @@ -1732,7 +1732,7 @@ ZROT 0x00FF = Gold Skulltula spawn var high byte (See Gold Skulltula Actor 0095) Circular Trap Door Platform //Opens when wrong skull is chosen Gate //Only blocks one-way Skull Top - Glitchy graphics, can’t see object, behaves like the gate + Glitchy graphics, can't see object, behaves like the gate +0x3F00 = Switch Flag @@ -1753,7 +1753,7 @@ ZROT 0x00FF = Gold Skulltula spawn var high byte (See Gold Skulltula Actor 0095) - Large shadow //looks like it’s reproduced, well-done though + Large shadow //looks like it's reproduced, well-done though Small Shadow //CRASH? No shadow //CRASH? @@ -2241,19 +2241,19 @@ ROTZ 0x0001 = Behavior after colliding with Link Dark! Narrow! Scary! / Well of Three Features Death Mountain / No passage without a / Royal Decree! Death Mountain Trail - Dodongo’s Cavern / Don’t enter without permission! + Dodongo's Cavern / Don't enter without permission! Land of the Gorons / Goron City - Zora’s River / Watch out for swift current / and strong undertow. + Zora's River / Watch out for swift current / and strong undertow. The Shadow will yield only to one / with the eye of truth, handed / down in Kakariko Village. - Zora’s Domain - Zora’s Fountain / Don’t disturb Lord Jabu-Jabu! / –King Zora XVI - Forest Training Center / Don’t recklessly cut signs– / read them carefully! + Zora's Domain + Zora's Fountain / Don't disturb Lord Jabu-Jabu! / –King Zora XVI + Forest Training Center / Don't recklessly cut signs– / read them carefully! All those reckless enough to / venture into the desert–please drop by our shop. / Carpet Merchant - Just ahead: / Great Deku Tree’s Meadow + Just ahead: / Great Deku Tree's Meadow Forest Temple The Lost Woods - Talon and Malon’s / Lon Lon Ranch - The Great Ingo’s / Ingo Ranch + Talon and Malon's / Lon Lon Ranch + The Great Ingo's / Ingo Ranch Lake Hylia Lakeside Laboratory / Daily trying to get to the bottom / of the mysteries of Lake Hylia! / –Lake Scientist Gerudo Valley @@ -2262,18 +2262,18 @@ ROTZ 0x0001 = Behavior after colliding with Link Haunted Wasteland / If you chase a mirage, the / desert will swallow you. / Only one path is true! Spirit Temple Kokiri Shop / We have original forest goods! - LINK’s House + LINK's House Forest folk shall not leave these woods. Follow the trail along the edge of / the cliff and you will reach / Goron City, home of the Gorons. Natural Wonder / Bomb Flower / Danger! Do not uproot! Death Mountain Summit / Entrance to the crater ahead / Beware of intense heat! - King Zora’s Throne Room / To hear the King’s royal / proclamations, stand on the / platform and speak to him. + King Zora's Throne Room / To hear the King's royal / proclamations, stand on the / platform and speak to him. If you can stop my wild rolling, you might get something great. / –Hot Rodder Goron Only one with the eye of truth / will find the stone umbrella / that protects against the / rain of blades. Only one who has sacred feet / can cross the valley of the dead. The record time of those / who raced against me was: / ##"##" / –Dampé the Gravekeeper Shooting Gallery / etc. - Treasure Chest Shop / We don’t necessarily sell them... + Treasure Chest Shop / We don't necessarily sell them... High Dive Practice Spot / Are you confident / in your diving skill? 032c Mountain Summit / Danger Ahead - Keep Out @@ -2286,18 +2286,18 @@ ROTZ 0x0001 = Behavior after colliding with Link Heart-Pounding Gravedigging Tour! / From 18:00 to 21:00 Hyrule Time / –Dampé the Gravekeeper Heart-Pounding Gravedigging Tour! / Tours are cancelled until a new / gravekeeper is found. We / apologize for any inconvenience. Thrust Attack Signs! / To thrust with your sword, press / CS toward your target while / Z Targeting, then press B. - Hole of “Z” / Let’s go through this small / hole! / Stand in front of the hole and / push CS towards it. When the / Action Icon shows “Enter,” press / A to crawl into the hole. / Pay attention to what the Action / Icon says! - Cut Grass With Your Sword / If you just swing with B, you’ll / cut horizontally. If you hold Z as / you swing, you’ll cut vertically. + Hole of “Z” / Let's go through this small / hole! / Stand in front of the hole and / push CS towards it. When the / Action Icon shows “Enter,” press / A to crawl into the hole. / Pay attention to what the Action / Icon says! + Cut Grass With Your Sword / If you just swing with B, you'll / cut horizontally. If you hold Z as / you swing, you'll cut vertically. Hyrule Castle / Lon Lon Ranch You are here: Hyrule Castle / This way to Lon Lon Ranch - Just Ahead / King Zora’s Chamber / Show the proper respect! + Just Ahead / King Zora's Chamber / Show the proper respect! House of the Great Mido / Boss of the Kokiri House of the Know-It-All Brothers House of Twins - Saria’s House - View Point with Z Targeting / When you have no object to look / at, you can just look forward / with Z. / Stop moving and then change the / direction you are facing, or hold / down Z for a little while. / This can help you get oriented in / the direction you want to face. / It’s quite convenient! / If you hold down Z, you can / walk sideways while facing / straight ahead. / Walking sideways can be a very / important technique in dungeon / corridors. Turn around and try doing this right now. - Stepping Stones in the Pond / If you boldly go in the direction / you want to jump, you will leap / automatically. / If you hop around on the stones, / you’ll become happier! - No Diving Allowed / –It won’t do you any good! + Saria's House + View Point with Z Targeting / When you have no object to look / at, you can just look forward / with Z. / Stop moving and then change the / direction you are facing, or hold / down Z for a little while. / This can help you get oriented in / the direction you want to face. / It's quite convenient! / If you hold down Z, you can / walk sideways while facing / straight ahead. / Walking sideways can be a very / important technique in dungeon / corridors. Turn around and try doing this right now. + Stepping Stones in the Pond / If you boldly go in the direction / you want to jump, you will leap / automatically. / If you hop around on the stones, / you'll become happier! + No Diving Allowed / –It won't do you any good! Switch Targeting / If you see a \/ icon above an / object, you can target it with Z. / ... / You can target the stones next to this sign for practice! Forest Stage / We are waiting to see your / beautiful face! / Win fabulous prizes! Visit the / House of the Know-It-All Brothers / to get answers to all your / item-related questions! @@ -2314,7 +2314,7 @@ ROTZ 0x0001 = Behavior after colliding with Link Non-solid cucco, hops oddly every once in awhile and only goes in one direction - Invisible, solid cucco, doesn’t move, can be attacked but will only smoke and molt + Invisible, solid cucco, doesn't move, can be attacked but will only smoke and molt Invisible cucco, cannot be attacked it seems, no idea what it does, but you can hear it @@ -2752,16 +2752,16 @@ ROTZ 0x0001 = Behavior after colliding with Link +0x3FC0 = Message ID //0x0200 + Value --0000 Hi! I’m a talking door! //Unused +-0000 Hi! I'm a talking door! //Unused -0040 Strange... this door doesn't open... --0080 Strong iron bars are blocking the door. You can’t open them with your hands! +-0080 Strong iron bars are blocking the door. You can't open them with your hands! -00C0 You need a Key to open a door that is locked or chained. -0100 You need a special key to open this door. --0140 Be quiet! It’s only time! I, Dampé the Gravekeeper, am in bed now! Go away and play! Maybe you can find a ghost in the daytime? --0180 It’s time now. The Gravedigging Tour is over now! I, Dampé the gravekeeper, am in bed! Go away and play! Maybe you’ll find a ghost! +-0140 Be quiet! It's only time! I, Dampé the Gravekeeper, am in bed now! Go away and play! Maybe you can find a ghost in the daytime? +-0180 It's time now. The Gravedigging Tour is over now! I, Dampé the gravekeeper, am in bed! Go away and play! Maybe you'll find a ghost! -01C0 Happy Mask Shop / Please read this sign before you use this shop... -0200 Shadow Temple... here is gathered Hyrule's bloody history of greed and hatred... --0240 What is hidden in the darkness... Tricks full of ill will... You can’t see the way forward... +-0240 What is hidden in the darkness... Tricks full of ill will... You can't see the way forward... -0280 One who gains the eye of truth will be able to see what is hidden in the darkness. -02C0 Something strange is covering the entrance. You must solve the puzzle in this room to make the entrance open. -0300 Giant dead Dodongo... when it sees red, a new way to go will be open. @@ -2774,14 +2774,14 @@ ROTZ 0x0001 = Behavior after colliding with Link -04C0 One with the eye of truth shall be guided to the Spirit Temple by an inviting ghost. -0500 Those who wish to open the path sleeping at the bottom of the lake must play the song passed down by the Royal Family. -0540 Those who wish to open the gate on the far heights, play the song passed down by the Royal Family. --0580 Those who find a Small Key can advance to the next room. Those who don’t can go home! //Unused +-0580 Those who find a Small Key can advance to the next room. Those who don't can go home! //Unused -05C0 If you wish to speak to me, do so from the platform. -0600 Hi, LINK! Look this way! Look over here with Z, and talk to me with A. -0640 The current time is: time. -0680 Shine light on the living dead... -06C0 Those who break into the Royal Tomb will be obstructed by the lurkers in the dark. -0700 Hey, you! Young man, over there! Look over here, inside the cell! --0740 My little boy isn’t here right now... I think he went to play in the graveyard... +-0740 My little boy isn't here right now... I think he went to play in the graveyard... -0780 Oh, my boy is asleep right now. Please come back some other time to play with him! -07C0 When water fills the lake, shoot for the morning light. -0800 If you want to travel to the future, you should return here with the power of silver from the past. @@ -2789,17 +2789,17 @@ ROTZ 0x0001 = Behavior after colliding with Link -0880 This door is currently being refurbished. //Unused -08C0 It looks like something used to be set in this stand... -0900 Make my beak face the skull of truth. The alternative is descent into the deep darkness. --0940 This is not the correct key... the door won’t open! --0980 Granny’s Potion Shop / Closed / Gone for Field Study / Please come again! –Granny --09C0 Who’s there? What a bad kid, trying to enter from the rear door! Such a bad kid... I have to tell you some juicy gossip! The boss carpenter has a son... He’s the guy who sits under the tree every night... Don’t tell the boss I told you that! +-0940 This is not the correct key... the door won't open! +-0980 Granny's Potion Shop / Closed / Gone for Field Study / Please come again! –Granny +-09C0 Who's there? What a bad kid, trying to enter from the rear door! Such a bad kid... I have to tell you some juicy gossip! The boss carpenter has a son... He's the guy who sits under the tree every night... Don't tell the boss I told you that! -0A00 Look at this! --0A40 Malon’s gone to sleep! I’m goin’ to sleep now, too. Come back again when it’s light out! --0A80 LINK’s Records! / Spiders squished: 0 / Largest fish caught: 0 pounds / Marathon time: 00"00" / Horse race time: 00"00" / Horseback archery: 0 points +-0A40 Malon's gone to sleep! I'm goin' to sleep now, too. Come back again when it's light out! +-0A80 LINK's Records! / Spiders squished: 0 / Largest fish caught: 0 pounds / Marathon time: 00"00" / Horse race time: 00"00" / Horseback archery: 0 points -0AC0 The crest of the Royal Family is inscribed here. -0B00 R.I.P. / Here lie the souls of those who swore fealty to the Royal Family of Hyrule / The Sheikah, guardians of the Royal Family and founders of Kakariko, watch over these spirits in their eternal slumber. -0B40 Sleepless Waterfall / The flow of this waterfall serves the King of Hyrule. When the king slumbers, so too do these falls. -0B80 Some frogs are looking at you from underwater... --0BC0 You’re standing on a soft carpet for guests... it feels so plush under your feet! +-0BC0 You're standing on a soft carpet for guests... it feels so plush under your feet! -0C00 If you can overcome the trials in the chambers ahead, then and only then will you be qualified to hold our secret treasure! -0C40 If you desire to acquire our hidden treasure, you must strive to obtain the keys hidden in each chamber! -0C80 Defeat all the enemies in a limited time! @@ -2818,8 +2818,8 @@ ROTZ 0x0001 = Behavior after colliding with Link - Turns around, can’t move, whistle-blower - Won’t turn around, can’t move, whistle-blower + Turns around, can't move, whistle-blower + Won't turn around, can't move, whistle-blower Purple Gerudo, acts like the one that gives you the membership card @@ -3035,7 +3035,7 @@ ROTZ 0x0001 = Behavior after colliding with Link - + 0xFFFF = Spawned Skulltula Variable (see actor 0095) @@ -3141,7 +3141,7 @@ Z ROTATION +0x3F = Collectible Flag //0000 to 1098 controls the size, where 0000 is normal size and 1098 is as large as is possible for the machine to handle (may vary depending on the level). //From F02F to FFFF, the Stalchild will appear but will somehow invert everything. In other words, it walks upside-down underneath the ground. -//Really weird. FFFF is smallest, F02F is supposedly largest (I haven’t been able to see it, though). +//Really weird. FFFF is smallest, F02F is supposedly largest (I haven't been able to see it, though). @@ -3224,15 +3224,15 @@ Z ROTATION +0x3F = Collectible Flag They say you can swim faster by continuously pressing B. They say there is a secret near the lone tree which is not far from the river in the northwest part of Hyrule Field. They say that there is a secret on the road that leads to Lake Hylia. - They say that Biggoron’s Sword is super sharp and will never break. - They say that Medigoron didn’t really think about his own size, so his store is really cramped. + They say that Biggoron's Sword is super sharp and will never break. + They say that Medigoron didn't really think about his own size, so his store is really cramped. They say that Malon set the original record in the obstacle course of Lon Lon Ranch. They say that Malon of Lon Lon Ranch hopes a knight in shining armor will come and sweep her off her feet someday. They say that Ruto, the Zora princess who is known for her selfish nature, likes a certain boy... They say that players who select the “HOLD” option for “Z TARGETING” are the real “Zelda players!” They say that there is a secret near a tree in Kakariko Village. They say that, contrary to her elegant image, Princess Zelda of Hyrule Castle is, in fact, a tomboy! - They say that Princess Zelda’s nanny is actually one of the Sheikah, who many thought had died out. + They say that Princess Zelda's nanny is actually one of the Sheikah, who many thought had died out. They say there is a man who can always be found running around in Hyrule Field. They say that it is against the rules to use glasses at the Treasure Chest Shop in Hyrule Castle Town Market. They say that the chicken lady goes to the Lakeside Laboratory to study how to breed pocket-sized Cuccos. @@ -3246,9 +3246,9 @@ Z ROTATION +0x3F = Collectible Flag They say that strange owl, Kaepora Gaebora, may look big and heavy, but its character is rather lighthearted. They say that the horse Ganondorf rides is a solid black Gerudo stallion. They say that Ganondorf is not satisfied with ruling only the Gerudo and aims to conquer all of Hyrule! - They say that the treasure you can earn in the Gerudo’s Training Ground is not as great as you would expect, given its difficulty! + They say that the treasure you can earn in the Gerudo's Training Ground is not as great as you would expect, given its difficulty! They say that there is a switch that you can activate only by using the Spin Attack. - They say that it’s possible to find a total of 100 Gold Skulltulas throughout Hyrule. + They say that it's possible to find a total of 100 Gold Skulltulas throughout Hyrule. They say that when non-fairy folk enter the Lost Woods, they become monsters! They say that the small holes in the ground that you can find all over Hyrule make perfect breeding ground for bugs. They say that the Kokiri are always followed by small fairies. @@ -3433,56 +3433,56 @@ Z ROTATION +0x3F = Collectible Flag - + - + - + - + - + - - - - - + + + + + - + - + - + - - + + - + - + - + - - + + @@ -3490,18 +3490,18 @@ Z ROTATION +0x3F = Collectible Flag - + - - - + + + - - + + @@ -3538,6 +3538,7 @@ Z ROTATION +0x3F = Collectible Flag + @@ -3551,6 +3552,7 @@ Z ROTATION +0x3F = Collectible Flag + @@ -3586,9 +3588,9 @@ Z ROTATION +0x3F = Collectible Flag - - - + + + @@ -3607,9 +3609,9 @@ Z ROTATION +0x3F = Collectible Flag - - - + + + @@ -3628,7 +3630,7 @@ Z ROTATION +0x3F = Collectible Flag - + @@ -3642,11 +3644,11 @@ Z ROTATION +0x3F = Collectible Flag - - + + - + From ee08b2fb01a627712d77c1ce181cc62edbac4419 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Max=20Beb=C3=B6k?= Date: Wed, 5 Jul 2023 00:33:41 +0200 Subject: [PATCH 04/74] chg: add more params --- fast64_internal/mm/data/xml/ActorList.xml | 63 ++++++++++++++++++++--- 1 file changed, 57 insertions(+), 6 deletions(-) diff --git a/fast64_internal/mm/data/xml/ActorList.xml b/fast64_internal/mm/data/xml/ActorList.xml index ac0e6fa..3790738 100644 --- a/fast64_internal/mm/data/xml/ActorList.xml +++ b/fast64_internal/mm/data/xml/ActorList.xml @@ -47,25 +47,74 @@ for each sub element (of ) mentioned below: - + + + + Large Orange Flame + Large Orange Flame + Large Blue Flame + Large Green Flame + Small Orange Flame + Large Orange Flame + Large Green Flame + Large Blue Flame + Large Magenta Flame + Large Pale Orange Flame + Large Pale Yellow Flame + Large Pale Green Flame + Large Pale Pink Flame + Large Pale Purple Flame + Large Pale Indigo Flame + Large Pale Blue Flame + + + + + - + + + Golden + Golden - Appears - Clear Flag + Boss Key Chest + Golden - Falls - Switch Flag + Golden - Invisible + Wooden + Wooden - Invisible + Wooden - Clear Flag + Wooden - Falls - Switch Flag + Crash + Crash + Golden - Appears - Switch Flag + + + + + + Regular Large + - + + + + + + + @@ -84,6 +133,7 @@ for each sub element (of ) mentioned below: + Default @@ -91,6 +141,7 @@ for each sub element (of ) mentioned below: + @@ -101,9 +152,9 @@ for each sub element (of ) mentioned below: - + - + @@ -121,7 +172,7 @@ for each sub element (of ) mentioned below: - + From 3987c0b21903c515acf845f1c95fd5d5a8ed88f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Max=20Beb=C3=B6k?= Date: Sun, 9 Jul 2023 17:03:44 +0200 Subject: [PATCH 05/74] chg: add chest content --- fast64_internal/mm/data/xml/ActorList.xml | 189 +++++++++++++++++++++- 1 file changed, 186 insertions(+), 3 deletions(-) diff --git a/fast64_internal/mm/data/xml/ActorList.xml b/fast64_internal/mm/data/xml/ActorList.xml index 3790738..65d8980 100644 --- a/fast64_internal/mm/data/xml/ActorList.xml +++ b/fast64_internal/mm/data/xml/ActorList.xml @@ -736,10 +736,193 @@ for each sub element (of ) mentioned below: - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From ae135cad9e6edd4bdd767ff6edf014da4c576c20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Max=20Beb=C3=B6k?= Date: Sun, 9 Jul 2023 17:05:43 +0200 Subject: [PATCH 06/74] fix: typo --- fast64_internal/mm/data/xml/ActorList.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fast64_internal/mm/data/xml/ActorList.xml b/fast64_internal/mm/data/xml/ActorList.xml index 65d8980..b50a18e 100644 --- a/fast64_internal/mm/data/xml/ActorList.xml +++ b/fast64_internal/mm/data/xml/ActorList.xml @@ -790,7 +790,7 @@ for each sub element (of ) mentioned below: - + From a9cbb98dee16fd2bcfee96a2c4d10e4931affc88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Max=20Beb=C3=B6k?= Date: Sun, 9 Jul 2023 17:31:40 +0200 Subject: [PATCH 07/74] fix: order and mm actor key --- fast64_internal/mm/data/xml/ActorList.xml | 1154 ++++++++++---------- fast64_internal/oot/data/xml/ActorList.xml | 10 +- 2 files changed, 582 insertions(+), 582 deletions(-) diff --git a/fast64_internal/mm/data/xml/ActorList.xml b/fast64_internal/mm/data/xml/ActorList.xml index b50a18e..11e2868 100644 --- a/fast64_internal/mm/data/xml/ActorList.xml +++ b/fast64_internal/mm/data/xml/ActorList.xml @@ -43,12 +43,12 @@ for each sub element (of ) mentioned below: - -> used to draw the collectible drop item --> - - - - + + + + - + Large Orange Flame Large Orange Flame @@ -71,9 +71,9 @@ for each sub element (of ) mentioned below: - + - + Golden Golden - Appears - Clear Flag @@ -94,47 +94,47 @@ for each sub element (of ) mentioned below: - - - - + + + + - + Regular Large - - + + - + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - + Default Invisible @@ -142,549 +142,549 @@ for each sub element (of ) mentioned below: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/fast64_internal/oot/data/xml/ActorList.xml b/fast64_internal/oot/data/xml/ActorList.xml index 105af18..a53b1eb 100644 --- a/fast64_internal/oot/data/xml/ActorList.xml +++ b/fast64_internal/oot/data/xml/ActorList.xml @@ -932,11 +932,11 @@ ZROT 0x00FF = Gold Skulltula spawn var high byte (See Gold Skulltula Actor 0095) Circle Loop - - - - - + + + + + From 60bf0aae1c65afd0293af74210726dca42059c36 Mon Sep 17 00:00:00 2001 From: Yanis42 <35189056+Yanis42@users.noreply.github.com> Date: Sun, 16 Jul 2023 17:04:53 +0200 Subject: [PATCH 08/74] feature --- fast64_internal/oot/actor/properties.py | 27 +++++++++++++++++++------ fast64_internal/oot/oot_level_parser.py | 13 +++++++----- fast64_internal/oot/oot_level_writer.py | 11 +++++----- fast64_internal/oot/oot_upgrade.py | 20 ++++++++++++++++++ fast64_internal/oot/props_panel_main.py | 4 +++- 5 files changed, 58 insertions(+), 17 deletions(-) diff --git a/fast64_internal/oot/actor/properties.py b/fast64_internal/oot/actor/properties.py index 65a6508..8abc1f8 100644 --- a/fast64_internal/oot/actor/properties.py +++ b/fast64_internal/oot/actor/properties.py @@ -3,6 +3,7 @@ from bpy.utils import register_class, unregister_class from bpy.props import EnumProperty, StringProperty, IntProperty, BoolProperty, CollectionProperty, PointerProperty from ...utility import prop_split, label_split from ..oot_constants import ootData, ootEnumSceneSetupPreset, ootEnumCamTransition +from ..oot_upgrade import upgradeActors from ..scene.properties import OOTAlternateSceneHeaderProperty from ..room.properties import OOTAlternateRoomHeaderProperty from .operators import OOT_SearchActorIDEnumOperator @@ -110,6 +111,11 @@ class OOTActorProperty(PropertyGroup): rotOverrideZ: StringProperty(name="Rot Z", default="0") headerSettings: PointerProperty(type=OOTActorHeaderProperty) + @staticmethod + def upgrade_object(obj: Object): + print(f"Processing '{obj.name}'...") + upgradeActors(obj) + def draw_props(self, layout: UILayout, altRoomProp: OOTAlternateRoomHeaderProperty, objName: str): # prop_split(layout, actorProp, 'actorID', 'Actor') actorIDBox = layout.column() @@ -145,15 +151,19 @@ class OOTActorProperty(PropertyGroup): class OOTTransitionActorProperty(PropertyGroup): - roomIndex: IntProperty(min=0) + fromRoom: PointerProperty(type=Object, poll=lambda self, object: self.isRoomEmptyObject(object)) + toRoom: PointerProperty(type=Object, poll=lambda self, object: self.isRoomEmptyObject(object)) cameraTransitionFront: EnumProperty(items=ootEnumCamTransition, default="0x00") cameraTransitionFrontCustom: StringProperty(default="0x00") cameraTransitionBack: EnumProperty(items=ootEnumCamTransition, default="0x00") cameraTransitionBackCustom: StringProperty(default="0x00") - dontTransition: BoolProperty(default=False) + isRoomTransition: BoolProperty(name="Is Room Transition", default=False) actor: PointerProperty(type=OOTActorProperty) + def isRoomEmptyObject(self, obj: Object): + return obj.type == "EMPTY" and obj.ootEmptyType == "Room" + def draw_props( self, layout: UILayout, altSceneProp: OOTAlternateSceneHeaderProperty, roomObj: Object, objName: str ): @@ -175,10 +185,15 @@ class OOTTransitionActorProperty(PropertyGroup): if roomObj is None: actorIDBox.label(text="This must be part of a Room empty's hierarchy.", icon="OUTLINER") else: - actorIDBox.prop(self, "dontTransition") - if not self.dontTransition: - label_split(actorIDBox, "Room To Transition From", str(roomObj.ootRoomHeader.roomIndex)) - prop_split(actorIDBox, self, "roomIndex", "Room To Transition To") + actorIDBox.prop(self, "isRoomTransition") + if self.isRoomTransition: + prop_split(actorIDBox, self, "fromRoom", "Room To Transition From") + prop_split(actorIDBox, self, "toRoom", "Room To Transition To") + if self.fromRoom == self.toRoom: + actorIDBox.label( + text="Warning: You selected the same room!", + icon="ERROR" + ) actorIDBox.label(text='Y+ side of door faces toward the "from" room.', icon="ORIENTATION_NORMAL") drawEnumWithCustom(actorIDBox, self, "cameraTransitionFront", "Camera Transition Front", "") drawEnumWithCustom(actorIDBox, self, "cameraTransitionBack", "Camera Transition Back", "") diff --git a/fast64_internal/oot/oot_level_parser.py b/fast64_internal/oot/oot_level_parser.py index 887f090..9674c34 100644 --- a/fast64_internal/oot/oot_level_parser.py +++ b/fast64_internal/oot/oot_level_parser.py @@ -715,12 +715,15 @@ def parseTransActorList( sharedSceneData.transDict[actorHash] = actorObj - if roomIndexFront != 255: - parentObject(roomObjs[roomIndexFront], actorObj) - transActorProp.roomIndex = roomIndexBack + fromRoom = roomObjs[roomIndexFront] + toRoom = roomObjs[roomIndexBack] + if roomIndexFront != roomIndexBack: + parentObject(fromRoom, actorObj) + transActorProp.fromRoom = fromRoom + transActorProp.toRoom = toRoom + transActorProp.isRoomTransition = True else: - parentObject(roomObjs[roomIndexBack], actorObj) - transActorProp.dontTransition = True + parentObject(toRoom, actorObj) setCustomProperty(transActorProp, "cameraTransitionFront", camFront, ootEnumCamTransition) setCustomProperty(transActorProp, "cameraTransitionBack", camBack, ootEnumCamTransition) diff --git a/fast64_internal/oot/oot_level_writer.py b/fast64_internal/oot/oot_level_writer.py index 33da8d6..6f867e6 100644 --- a/fast64_internal/oot/oot_level_writer.py +++ b/fast64_internal/oot/oot_level_writer.py @@ -784,12 +784,13 @@ def ootProcessEmpties(scene, room, sceneObj, obj, transformMatrix): elif obj.ootEmptyType == "Transition Actor": transActorProp = obj.ootTransitionActorProperty if transActorProp.actor.actorID != "None": - if transActorProp.dontTransition: - front = (255, getCustomProperty(transActorProp, "cameraTransitionBack")) - back = (room.roomIndex, getCustomProperty(transActorProp, "cameraTransitionFront")) + if transActorProp.isRoomTransition: + fromIndex = transActorProp.fromRoom.ootRoomHeader.roomIndex + toIndex = transActorProp.toRoom.ootRoomHeader.roomIndex else: - front = (room.roomIndex, getCustomProperty(transActorProp, "cameraTransitionFront")) - back = (transActorProp.roomIndex, getCustomProperty(transActorProp, "cameraTransitionBack")) + fromIndex = toIndex = room.roomIndex + front = (fromIndex, getCustomProperty(transActorProp, "cameraTransitionFront")) + back = (toIndex, getCustomProperty(transActorProp, "cameraTransitionBack")) transActorName = ( ootData.actorData.actorsByID[transActorProp.actor.actorID].name.replace( diff --git a/fast64_internal/oot/oot_upgrade.py b/fast64_internal/oot/oot_upgrade.py index 33a5237..20a9335 100644 --- a/fast64_internal/oot/oot_upgrade.py +++ b/fast64_internal/oot/oot_upgrade.py @@ -1,3 +1,5 @@ +import bpy + from bpy.types import Object, CollectionProperty from .data import OoT_ObjectData @@ -34,3 +36,21 @@ def upgradeRoomHeaders(roomObj: Object, objData: OoT_ObjectData): upgradeObjectList(sceneLayer.objectList, objData) for i in range(len(altHeaders.cutsceneHeaders)): upgradeObjectList(altHeaders.cutsceneHeaders[i].objectList, objData) + + +def upgradeActors(actorObj: Object): + if actorObj.ootEmptyType == "Transition Actor": + transActorProp = actorObj.ootTransitionActorProperty + transActorProp.isRoomTransition = actorObj["ootTransitionActorProperty"]["dontTransition"] == False + del actorObj["ootTransitionActorProperty"]["dontTransition"] + + if transActorProp.isRoomTransition: + for obj in bpy.data.objects: + if obj.type == "EMPTY": + if obj.ootEmptyType == "Room": + if actorObj in obj.children_recursive: + transActorProp.fromRoom = obj + + if obj.ootRoomHeader.roomIndex == actorObj["ootTransitionActorProperty"]["roomIndex"]: + transActorProp.toRoom = obj + del actorObj["ootTransitionActorProperty"]["roomIndex"] diff --git a/fast64_internal/oot/props_panel_main.py b/fast64_internal/oot/props_panel_main.py index 39177fa..736c791 100644 --- a/fast64_internal/oot/props_panel_main.py +++ b/fast64_internal/oot/props_panel_main.py @@ -154,9 +154,11 @@ class OOT_ObjectProperties(bpy.types.PropertyGroup): @staticmethod def upgrade_changed_props(): for obj in bpy.data.objects: - if obj.data is None: + if obj.type == "EMPTY": if obj.ootEmptyType == "Room": OOTObjectProperty.upgrade_object(obj) + if obj.ootEmptyType == "Transition Actor": + OOTActorProperty.upgrade_object(obj) class OOTCullGroupProperty(bpy.types.PropertyGroup): From 4b1cc56220fe766577238bff0b38a0534910d620 Mon Sep 17 00:00:00 2001 From: Yanis42 <35189056+Yanis42@users.noreply.github.com> Date: Sun, 16 Jul 2023 17:13:21 +0200 Subject: [PATCH 09/74] black --- fast64_internal/oot/actor/properties.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/fast64_internal/oot/actor/properties.py b/fast64_internal/oot/actor/properties.py index 8abc1f8..5f76ae6 100644 --- a/fast64_internal/oot/actor/properties.py +++ b/fast64_internal/oot/actor/properties.py @@ -190,10 +190,7 @@ class OOTTransitionActorProperty(PropertyGroup): prop_split(actorIDBox, self, "fromRoom", "Room To Transition From") prop_split(actorIDBox, self, "toRoom", "Room To Transition To") if self.fromRoom == self.toRoom: - actorIDBox.label( - text="Warning: You selected the same room!", - icon="ERROR" - ) + actorIDBox.label(text="Warning: You selected the same room!", icon="ERROR") actorIDBox.label(text='Y+ side of door faces toward the "from" room.', icon="ORIENTATION_NORMAL") drawEnumWithCustom(actorIDBox, self, "cameraTransitionFront", "Camera Transition Front", "") drawEnumWithCustom(actorIDBox, self, "cameraTransitionBack", "Camera Transition Back", "") From 8dd4abdaea32db73f87e517c62cad451fdf272ac Mon Sep 17 00:00:00 2001 From: YoshiMilkman Date: Sun, 3 Sep 2023 18:20:09 -0400 Subject: [PATCH 10/74] Initial commit --- mario.blend | Bin 3195132 -> 6519252 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/mario.blend b/mario.blend index d399f5314f8a3882923ffd6e4e5c720a1a325979..8ba0718939c8537f1b32a481ce89e400efe51cd1 100644 GIT binary patch literal 6519252 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 #@|gF8Sf+ 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%0DSQIaV_`(-h}vJ+C5F|zWBQEL+s1SHwZs$Lw=;b zr}KmMM)CuE@cD5K_yOMN{5aOM`;pjv@pa*c*q7xr2tSG!n)Od7@7MW3dv$)4x$g*k z@cD5y_yOL8_+dQ%k>tLt#N&(Dm(|iB{BRBVQTUF|584~a5Aea~$Ccm*c%$>I78v(G zBtMq+UqE#+WYXtq2!4#blo@SueiXi;^Mm$A`Va8I=f@S`2YADZ1V4=DKO{dKv1fz& z%w-+;Vf{AaHaR~!zpnFx_Uin&c>4GjeDL}4QSbx2VLd8-ER5wpPU{{zkNQkyUE<5g zE3(BV=f~tXb$-y^V0_sNl_Hj~OYsGK@cHp!@B_SIJ;Hy)n*Z2k`yV3@XYx(XkJN>~y8VxPGVT-2-9Ihdr}KmM>hYz_{0I2p z^W!r35Aa6k$3o-rt>nk9+yA&FlW%f;_dmoFu8e&TF(_Gw z`LU6I$c#3*|0sM&_aC%Z_a9~A3;5vk<4*7cykXs_{^>Es{E+v>@3Q?<>+(#o$@$TF zvCa?L8}uKjYyDhv@WJQD*T4_(Cd3cp_#*kS%l1#L&6%kt=SS*;IzMP{r2haPe16;k zetKKT5&9sB@qbbc%{oSWyUYygU^p!zz^_7 z=f|-z#xJ|_{MfdRsmGh!e@qVR{Gh!$Kg!IHfe$`EZU#TV8=W7=#OR-{+=creCv~(m zd3-4h>HMI*!T3_P{{cSu{1^p4z#E+(Cm8z=>WMGwFh6FkX)iXp|L7dl`9XVi|4}Bs zfDb-DJ`a9?H>^)JKX#mP|Fkuo>FwS$5c@W|x~%V8h5JUEoFA$4b$-y^p#NZ9Yv=ud z4?aI`0zbeTrU5^U=f}X0bEwZ$)`uUwQ9Uncu?e$d`Xet-`?KRyS3fH$m1@WXig z(waW4XK=88Fs=is4?k|+o^NvhQRvh8L3<efaV8 zcBjet(YZ}!e$d`Xet-`?KMLRncoX7>@%Ux_F5N%9XuR0u{OHW<{Gh#& z`~V+(eq0BBfHxt27>{4bkGKw`F8$MyzaJlMa(<*X>inR+k^BH3e12RDetb-Dlc#&NgF`7xQ(`9XUl`={Uo`9VI|;0>=;|8)L*)93yzOfT>6=^M5N zt=u4Wn#lV2k6Xv{P0o+PdYvD%H|Rg)ys3O?^QYISbmWJ9wYpZnEd7gfY>oS;tzBoW zYBhZ*Z3%|JuAb}Wo?QMs?7&ZF_Hjg<2|9L5)@gEnbgnD$BPB|P_VPUJN`>X$rwv~C zJh@Wo<9V=5&-0F34ST8{Pt1c9Vbq5w+eWi3P0o|lTAe4fw-QgL-46p^_&m7+JPG*~ zpC`xrRaVmn$&>lJsy`XIDQh=5PbSysJfXca<_UP=^W@{;3HU=YkSFuw@MKr@Cu_E4 zr~Y4)&x>^FJfXca<_UP=^TY*Dz@HFLjx`+s&)=2%Cv7)mi%rgx&U1C1(B4WsVZHnP z6Y#?4$w$Ex@Q1&rKWQ~2ipP^()t{sb+0iEFN$UMNPiSu?o=oeXfEPYbE(1@%pD<5M z`xufZrfG>m%DRkqtZTDwlk;Tqy*f{5?~Hi@UiduuFn9v~u#V_Y=Ev|SF(%~*qdq)& z^r~!2ldtO)R_i>Wy))(sc;WNpWc6GW8~kAf`8+XP0WQt2QKOmM3-c%TE8cj5{yec$ z#q6EI%bP#BJezNFf6{qQi6`%fnZzs(k#egEnzogcI}k{{rM&ksCz%LZ>)k3K(+}tq>o$19Yo8y6^YY-wF6uwFWb;kVkIt1kKWJ|?e#qw#^0|Y24xw|9dcGZ> zPe^`@eJj23xl1i;MZSA|ZcsjDRy z&ml}~oz@cNHgZ?SZIE_eyx8nH4XG8Sb}rXxX>X5H zE8jo6%A9rNzCg(?Cxy}#TTdluf%_+srG0}Gr|5tf=&rBE3 z#+Fk2cJ?0lt-96|ntrF}A$68{#IX1_s6Uv7pFK3%bG*ej9&Skd&C|2{dsUvh%VC!; z2Xfovto7admoDbpV|$r@WP28m-*~x9yB00K^a}o6#tk`+;JAU~2=}j5|CHkkrcUa4 z=9vrE_2$Gt!f?9F;`7X(36CRMF>W{vG7WiXXdLk$S9;?J+C}NMtA1S(^1&ayChNZO zKSV#i`Z$92BsQ2BTb-5js+P5H#%kLqYmJ;Mo@xFOajm~n#n3nc_A~z5^K`qJ8vB8H zS+h*1)9p1UDwAL~_lqahKa}M*^7YJAgN!4}6v>Rf>O5VK|FpM!|1dCq03UpQ9F6t? z-Y|2;57X9ZS#L|HJE$v;tP4M^uVz}BeZ69t&JWrf$q(?s=f{!YN63#Tei%+R3PK#2 z7A`e`S6%oqa#O}`a(+xM)%ihtBl!V7`21)AKfoJSsp5y>rU{|ssA-XonroA@F;A7) z{DX`y*0q`9qm8kz)9Eyurz*Th=LhYL!^*{bLGu0scFfF;xckBG1z18L)9u?yZ8+`EjaX9z^-VhJ?VcY?c{f}Li zAJ&G6QOx< z*w1!uqa4CWR6oIZm|>|n5dTKy#OEnwxwRdhZE28p?)01W6DB+Kc20W(aR6(-ay>XO z4-P(%ALNA%-tao^I8?=f`24Vv?ng>~SO;gF2H}To$d5w1&JWrfjsw%~BZR*sKkSg- zBtOtkFdl~{=|2+fM@pYN)|Pb}gdePrTIJ+RIzMP{z<+2e{e4#81Np%p+29SY{e9W| zqDGmV{}@ZQAL+&9HMI*<@*VNaR&I{^J8D| zBjiWG57TJ?YstcF*RovqV5YZcpjK|_zfbu7PbjySHTitg|LOdoy`g@B*q?c+*r9pp zrG7sWeDL|P5BLGzux`K)nG3(VOcNHwJdSt9w(fYsI>5^NvV;{6|ZZ`;WqJb$-y^NPd71K0j>m1H1|G z!+4@o^gm>Hp*mw(ul}ji28{eZ#RCQZIgtHaR~g|ETkW_D1ppd>}u_2OGTMHT;M1 zeypWE8}q~2p26I@;hz3JYOP)R=PkY?d_TH68NoD*Vw3Zu@P`sVT@nt`j`**lQ_=- zAMaCKRbC&{Q=d(J$j3Pj<@bB&8~wH_$9I?4$Mn=!yhPz+KCBOSo|+H$>tpqRSB`t3 zzWw?@dg^m=&3ssXzCM;;XL)^0Pkj#b5vTh@*m)H2oxDZW@1pYhn4bD<=yM@iem=g> zqx@Eu*T?kKSNsslkNQxrEJu4K_?J?=3G;>Nsn3Nz=0m>NFTif>W3yK)z2W*`dg^na zkNHp!>&5N_zJnFMus)`zJ{$U6>OB~wj)Fg^7-&_|s10#y&rVW^L#ko%Xnm+7g`hCUaPdU)=YJxA%WKUZEK(^FsZB9vbx zeY2r&TX}sT{rv`ApMy5A@woULVs_pACI3?M6NL<##9a z70T;ldg?1)i1MqX?`zO^U3q;>Pkk=*F`sGn-T{5rmegacIdmNygsI< zJ{$U6>dm43o&*1PB--zRe>hF9i--LI(^Fq@E6R_0p{IB@^re&@`_S_Gn4bDv=wm)E z^to$7`sS3^$Mn?aKp*p=p5oK+FSCK~V&xaY_A)*7+0f@wFZ8(2K;K31FJ~&h71qb} z)K|O!c@ojF+KGax1ju}cb?Kioc6Wo4=qu8!}^$> z`dsK^J~nW<&}&}-eb*@&u3x67J_q`kPw~y@kJIi;P%q~yd|`b|PklD@xs<;R)yE~^ zUtjt9V0!8+Zbtb*pVO-FxzKADU~fl-@y zr~9I^mwN3r;LA1T^)Ws5+0f@w9szry*S-w+)|R)I>8YboUHUsD?g;CJ_py#$2l44*F)b1T%TB8AJbEx4Sg>4 zo~Y6jr+qH0hAlCg?l4ygsIt=xu&pEUADX)*|sjoPI@}oZ3 z$$GZ;#rX1?^5aXUr#=_@m=AHesAqd`=)11GKBlKW2l|+g3!W5@M*SWRK08W=>x1d3 z&xSsidck8~-=WaAw7fp1r@kWY4`4nv<_&y(Dd<~XULVs_p9_7=rx?a}F!a5|IvgUZ$r$2l|)~+pRyZ^A_;=!{zzR^weiVpG&=Hzs2qF2YepT z!4=vs(otV=6UvYJpof0YJ`ngmR~{eJQ=bcc#7Q0(e*%2RqWrEeuaD`e&w)PXLw)u` z(04ra-B?~9(^H=feJ=F^R}s9iZ%}&dkC)fS^wj6}qWow#aJk^My$$+4T3#R1Q(qDK zm=Dh}v`;`>Uo@!Zi}x=df0>^8+@%U1^O>d(=kD73mDk7g)K`Q)=3{>!^}zY;W5JgN zs$QnGH>9UN`!wLg_s)9}hiLEq7_ZJPkB{l8&w)PToThI-=-aovKBlKW7y6iw{r(WX zeW7ok^7@#b`iju!P;Xe@KG3&!d3{VzefBbxAMJip)rW8Q`a#8)1C-uyeK0-sInc*^ z>?csa#JL9g=9bsT^wj4tlNAvzMd%h!gedd>8iKjq&uN^7b-4^*PYTeCYRz z4?y2N(05XKeN0b%F7z=U9~b@B0@!{?wKKf)dK%AyL@|Ndg^nbkNG%nRsCik-;s#FStY0O z59z6|h->CEOT{uw`S|`|3F?KEKP!Dk0dx0;9DV*W@V0!AaSD^f8_qidy z*s#}Dda$m({Af4ghkYOX6`$jpDqp`$Pkj#bF(2xo-Sz>n_vrHan4bDv z=wm+QpZgxzeX{cN_KC{waQ!kp^%bGdAx@4zPKCacpzq}J`k0>j?6XjQA$|7g(03yA zEhw*#>8a0wKITJvi_4+!c<7r~ULVs_p9_7=hk6|H=4hqIeoJ|MOiz79=yRwScKUw0 z75a`WuaD`e&t8S{gFe=)13zdV4}Hg$*T?kK=RhCxDY9M>m+X_EZ%zgNAwBiExMn`? zF=`y+v||3{bBO1|<^3tsQ(qDK9O7K4^ii*UBlO**WSGxPPkr{;C_my{p!5}?*S-Pz zww2e%^wj4-AMe|?Mh{k4|Y$Mn=^uSWS*(#QLd7nRq?^wj4- zAM=@JFYjAjP+lL?Q=bcc%!m4HtkZD+xP5VXJ~KV_6`{`|PL!X&PQ&{awwBk&^wj6D zy@mAAFWB7YK3rZO)BE~x&LQ*RIS>B6J)8?-A30c_e@IV#MO-r<`gvbppYnV5VdeEP zy|1rZ@rCCx+L&kJzDK(i`fe}Z-ik<1ec1kKF&`fv_n{Ks&C~U@iNuAseb+08*ND$@ zKX6*Sf!!R~&4Jw<*v*069N5i)-5h9c4xH9*Sp#As!0rE|cmLp<#AnP4 zh^mi%oz}i-^U!ejx_qu{%fflBt)|ZdD3{ZbVv^bU(g7Q0c5Y@l4eC2S7gkF3tYrP! zu}CS;!4}Vvz5iq>SqAos8?@)3+G~I2m6QBUrI*OZ(_vYAR{Dwly~s??&$!}S+WQLe znHYjU=DK6>yEva)ZdT>%T<}J19!btS1z*I+-xFW)%Xf; zm}w24iH~@QFMpfDN8A$Mx_)t(Mqh3)Nv=jgB|hRIKKmAhkGLhivsQKY^=yjLIJ3XI z|EBa$-J{nN*KeqW`1pI`3#XI#wldKUl*C6o#779kE%7DsSOw~xsU$wuC-K=|QRU8h zm-vRoGc9JSH|lrAJHQ`E{yywGh>yP~KK`E4!`CAoJw3E;u)nvLU)Nm{AIppQittY? zSBbB`U!H^0+cP9iI>C|7##KJLR{1@5NcVpShb$&O{+{@pb$U9PtWTT~7)oCAW$Kk_ zE$)OB$odV|vBW2*`h)5CcVZ`2VxIzb+9ZFU+d9zQw|-^!+Hi(-ye2;4AwGA#DqG@~ z_^$+GUqJ#&#eG=3Wn^aAF#6x^7Ifak7OZeK?4fhZ3D0n_T;vv2w@DX?z}ozYCt{l5fAa%8x=m{miX4^)(z&m zhjLC%9=H@xQpba1tkw=>4BFkQLw zC0^n$0zd7NX*B$?N^^SRsPZKq;>(|>%9prh`rOu@;ZvtQ9c+4DNq)ojMLfi3_bPnE zE%B}MBKwX-NPNUYe51fe+!9~U(AmNRWV<(YZ;ai?n`s#nAMp^Mvq_a7aeL+0-?t@q zVgKOi1M$uQoGCW>JK`fA;+q0K;+A91b-;IK|8Vz?LP&hXLws(ZDnH^5mfwnjTyA|W zg)oEPO8w5w}ds^7HT+`o~T~{}@asZ3)MB;wAnf@YAkf`MxKY8#t|h zlQ`0Jvq2A~Tq#!mj^#@{#FrmXSfQrYl#z#7q2Bz)!nm8sJwz68=}}FZW{k5)bilPKCH-+M)i< zed}YDu2`!uEZ<$+&kyY*bzkKs0@yYRN zFr6%G(vbLxm-yX3DEzd`tAF|EkFM^`!~Fx|VRFnN85vdo#N*@pi^50TGX3T)U2D6C zdUn{li?p2O=K>G$6<_muZ|#n_B|no~dnvx8>~BFn5{rDvx(>dGkH06r{L4B&W%;!S z6DIsQs(y)w`0RaE`4P8F-;pq;pgL?74}Rr+X892h@r?o>aZ7ySp}BQ?h3l0W5g+jo zpYv)}e#9;D)pO_@Rer=nd{e+j+!9}VS9k9~zMG~cDrLUqUMxT2AwGAmDnH_u_&RnX zKH?!hwtM21_%b^YAMp?$%bK_)zHA-w1?Oa$x0I}3`eWkDzaIV>emm%&jUTiZ$T+_r z{MP|W@=xJ*Onm%3@!7A{)5-E{r;<8IslVKd_=t!2MuCsGW%`}zpNWU~oc&e#5x2y* zGyOC15Z@H=5x2y*GyOC15TE-xRer=R@$F3iOgzNbf_6pR9{=j-Uu3@JUTh!4LwrTx zBW{m>I}so85Fc$JZjXO;#24kC>5qxePAUG;Z%ce)#%yz!7<#O0Pi%`2i=m=q{SpuH zxd$qI#4Y28+Pjp@_LfoDKlRrt9|GKiA0Ua3zb8H?luqK?nR}Orhxlk0aZ7y08(BhS zQp+XFk9dfWI*421yNF-zKuLV$8}YRqq`0PUzKH`>TF6)0o|6o#6V48j5a^oL~k9df06!?f+;#=2K zH+Y0IO%fmR5TAV*+7EC_{;imn+WZUWP^CZrMx948pWuu5_HuVe+_9yV1&tU#hpNWrnh_5BB@DaE4S-t%iM5#;s z@5Dzu#8(79;+FXGVtpua0KUTK+x?G$55z}2#7Eu|w^zU2Lv`Dk7TG^UJ0d=sK-?1F zP`+nFGPD2G9xYjZ^e4oZe~aQD{f=z+E2GuT_!pz_U&S}i%)jvW#OJ(8PbbT7-A?o` z#6x^jz(?F3|8}B(As*s$4_DEI4ITjJZ9;}7B?zER*K?w#E~ARgj#zzgE8fB&F-4YPiUhxn#|kGQ@1-HGE5;vqg- zL);SI&K!TxpAesOl4>9HJ4uf}THdboyYJNfL?!>i-xHsEyq<1n`xoLNzR~$8KiIjm z{R{CBU;Y@BKgw}u`xoLNK6jzQN8CHxzYvd)54Uj62V#qwrSrysBcl$83*y%>Lq$Hxc1 zN8H5c?P0IO4$DYVnqlP) z?FgoW9rA1^yi0ZvH|=P7g|dV8NjroujcbPG8rl&|SIrLMrX5q@744ID2%pxqPTXym zi?KF2YG_9=T{Sz1n|8Q+q5Yy>Xh+=r9mNPcjx=J<>Gi`8ZDH~{;pp$i8GF!Zars=QSzWjFYEVl4p{4xd} z;wyq5#O>irY!*9=!m_?}%hC5v|F*PGfOv>6Z=?Kx+ryW{2J3Pl#CQL8`|VZn5fAa% zf2Hsdw})?G1?35R{fkG=ty;gtLwxQl6+Ytj@GVLJNCg#7KJf(3@6&(a^AC84uVuEv zN8BF1y7bT#o-d5HRK-U;KE8dxKj4=5y!hPPzrJh3VD~!R%(`8%{91sA_=>nDZVlh2 zp1!&P3MnQ&;_>mJeu-Q9aIFt%*h8?-GV7-W(@7ux@SPu8eE((k;@r10f)}O!O%b?h z$0*x5%3IpeEsjDI-2&AYHngL~(2ig_X~)VF&pG+Wx&uBDAMp_16z2blTjG=Bzm2{9YrA`shbi@!dl4V; z5MK-Czld9=_xAU1%*8(Ap&X7%-w_}2`1mk?L)<>T%>x5*#u1fpRQle>2Ry`=KT)+G z;`Z^0O^!PQAMp^Ma~$viw~w!XIKMOS5fAa%$0~fp?c?*xuWL}u((MqKtY6|GKAt;3 z+;Uwl$+Ly+cfkLCP(R<`zz`9AeE2=_jpCX=m*pq@pDMUb{p)wo2~osHJj6Ez{?Sf} zZ(VQCK-Zu=dWoo$lTv@V7x57f@#Pnz{85fF{l>0~)^6Ugp)S0O!bd#BS6r%iLEH-8 zP`fPWU%2C57Mm&AF?ijP7rE-hLwtEhl^<~{e4Ew}Z5UQ}@pi56NwTLU z=OxO$h>v)PZ9aX@#78{DH`S)fkGM5_as@tN z4;@v0#6x_=OB6oh4&oc=8OX^VOu70<`a6~%@etoA#?8bX#OIx2C1zwd4RjCI8zk`& z5Am@ah&zbyqM^ZcL%AK$cm)XJ<9tRKALl*f{Koph?hCqlyDv;)0NeupP_jJ2JS0B; zE{rdjZfMi7bz6B0<6^!(KAd++e9kDIeS>Gj$nx|2N*(s*5lcBqe8fY1_9V_H1a65> z^y*LR7P~Ndy5n=t{Sf@unMx8{aPNZrj`;X{;+qOR^Gp6ViD%aoBGw;dJqPPr;*ayBg&sxoakLoeG`%0ddfh>ySb@m-{+lSz^&+fl=^ z4WrO-87)&S2O1_AlSc#qSfHvu6TgOdj3YPyb@evR4@dv~$uS;b+-?(gxhGiQ} z7cN`I@Gy49dKuG)2fO=*3cmLw+N z!XU);o@Kt1UlAYi5MRr%!bjY)Pqaa-z^)a~se0F7|K_;!`z`NP`rR%i39r%|5`Ry8 z`SspqdoI?txHVKbvzh9M&bFN-SmCBaC zC%#dnmu1RV5@nl@*yp^T$V|TZlI6F*xCo|`WjnM4L|iEr6E}+o`&diYvaE@nwy+Fn zqfDRc+mTOMQ`Qh4@erT-tMIWXa}VFvf&Rha({|WCK8b<&$jvZ5ayZDL;r*vgcS<-&i(v^NW6F2P`g&nj{ zFK00o+12korMBM7bu4G%AwCD|U&Jl($@@b}Wi2M2y6gUUQosC&hxk|z#4WFrz*dOp zTgm+8n=e^@@_hSXI$2io`LE&$?~A>^i_J;)iW|<9=el1b{wV)G)7P?mTh_RrqpN$1&F{&^02Gf{$a&(|fWETAfNx*GdQ ze#ot?EKj+CpcZ}vR2qC#_e0($GGzH)1%4KvROKC3YTM}(WIf9oJ~JlGd_Oz_s7M( zitXZ*gAU7T5%2oH*6(@6`1(CB8{hB#LnijS|F0)1CJ#ozzPqmsQ{<9agdHzH4YDNFL^K!!(qjO%?@9By%J7~gwXt7r=%x71X z_LGWlwc_i1T-_fe>s|IkXz!=X*1Kxw9zW0yqWE$8=HXZbiJP9~A^Gw0t7j+9kCq1E z2g{*WnR-m;2kouK4;csO_ZbK5CzStWd?1eG_F!^Yxox|QwPLBg4FTecqrG7sF z?I4ODas7DQ^sE=j4=)ZR%n!Rk_`!0hRTh4s^Mm$Qv%}B)V`fK>2Ohfjr8;S!W1jsN@iUVi|QT*uNMaBb?A6^_tm>;7J!jJN;KKk3qpX>afz18?3 z;{g3Wp`GCnZd#N)vHFj|IekS|Fv$u}_@a(+Ezx=E4nNS>n-BIm4t{;z^zGO|Z zbg)I zfZb8;+#3(n21)z%t{Mlf`~Bsj%x)TY8l;`OrsIJh>+PKOR%_>896&pW;)fa!XjNX* z#jY9$$d7!3@S~%6)c2D=(D^}otMS8IAAsLy9B_Y%`4z+m=9_pNm>+L_;7{T4z@6~> zly~DAl6F**MZ^J0>z-4xi(a{R^mw3>LeuY0`()NS?NizB%{_bkdvo7ac|34cC=S5x zsCFK=KOZ+eizVs(Le^>5iZVNWe5$W8_6s?N`-KV*=Z5+0Oa9+T%7Iv(bV>+@qn@?EeuKFS6fO_N0oWbY&g1&=xanza((A+rJ$IETvw7q8Y60uzzgB=z$N>sbz#bjaSa)ji39&nd9he0{_50g#Qyyq zJ1=yISSLP2tP{_D_{~ae(6jqDU$ZWVo)Hq2}5oFIZ$fbZc1N{yFAjt=t>JoC9S=M!;(**QRBVuT?ilVD zn*65T&S`J8{+<^H&<>*bq2fRdgb4jKsW@OU4kUCR8Tm2QAp8gw>x?f8-_ZF%d#mxo zTOWYmXB;R#pyB|>1q5*0``@tfxl4oRNSU4FDkjo9dSg7Kd$v8xTO;^GI1UWL@ApD} zK$o<`U82tW;x(mPR;{LI}m1_g{S=Q&W z*2taH?k6jpq}D_Ia|2*M+qpfU?5BN{o*(Zr+p{ZmB(ex1^vt#a7%9rAY*&Ys=KB2jXcAX!zH@J^r7K%?wpC8}@`N0yl!5dzKAI1UZ|Fd^C z@Nrb-{-2hD1uc~ z>7Hkv=bZ0(p7Syn%k9eP7=Z)ExuC)`w2iv1o+3^wYx*Hi6azf6~~bDqnvaw&!8N+*E!9ZU>zgMkXf5By<&c2x*N=QF9|E@Mp$WF=k^OUF@`g?^K6mWb{ zSZ77gFG7Ea;zW1dNVhzFketYU=(ss?62b}Vp;kHiZ$VDzZ#A5_`_ae)%nR0iUS8lj z6zz#WFQ`pn%I1aZCVAH-QC^Q@NcvGunmMnZQttKAXL85=-}}ZrFU;Naz1-YQ|C4+9 z>P6|7uRgPEUdSF4$_wy2s=w>Tb=~r;|G4wQ+)dvRb=H?2OGtlrUQo*msj0#KPJgTE z@9Rb4Fwq~PIMI#ky5$Qwi8C*d6Z6qztW&ZcYLy++f}GIbYB+KCr;!Jk7wmhzyuf(_ z?TI}vOx3%OxoEy{1M&dnjW~v+ALXQlyg+$Zra8AmPR8Z&oiD7MenGBz(Lk>Kp`WJP zANoc4yf7t{7vOhPfA85wu2YITFElSYSJc_9>E?v=cjqr^c_BMJ*x%`IHT~Vq3+N9~ zob+uY*DJ+6Umzz|LO3ZGucH1wIwQyl{jG)*cfT5WfO)~W$IAqs{t4^ZBWW5}qJ*vJc%t1qzAxg8%H_q?zv=cG5~9!wvf*)MZ^=7UB1)bt}Y zEtD7FcT|7Z9q;Rwr~Ps7M{dfk6LmH@)18q1Zv9m)FQg96_jkEoOn*zS7Z>bTqaQ@^ zp*zmkEnmn-ocFVl4?7`zupVla9Ul$yL4Pap;qE6O?lTXVj+X~GPoN#~=K-~?tFn3E z7Q}tZH8_T(ALXQjJV5!qYtKo4+k9}`^T3uZKTB`f@_*?wcY1H;%$@cvp9kK#r@Kz( z?<>RasD7>+$92o+>p$Lop&Q3_ z%NOzy=lyKt!$}Aq`Fg1Bx6wm`e9+%Ye7O4ui2KX~*4< zai8*b97EENa?%{Z{sH9IPg=G1ClYVK$*sR={n|h5K0ot^-4~S21KC|e zc>sP#_4A$vT_;+9(F>x^Ix}Ml>F3Vlit~Yw<@>qZSEj$!%>UhWBJ_tSPWl>jors*6 zj~$VS>zvEQtEj(s93JF^{#L_@yMKT@z`S6OczJ>I1fDNP zALXQld_Z|Z_b=BDO?msc=Y`fw_sO+h`Y*XHcg@Odx$F3{c_FoXC@;Y8sQ#`yzSk|! z`j316p!L%Ch&r2{X--Igx1LqY3)znc`#b%uroX#+0sSG06WwvXZuvq^;@npzC*4mr zc3v2r8RUfiR>O(Ae}Fu|yx^?$@&e}#Y@hh^g5J7O(R?9;JV1FAjv?tsIcXy=P`>A? zzpcIGY;h6XIL{Y$`RT`UyZrQk-0WLsW@g{gUN$de_YCC)_#M^Xb>q5jdDeg2d105I zP8W67nlTg7-)+UbF#6_h{(7ODFVNp=`n#JK&>x~W(T(f6E#8^8)#4Ld13lNR9%zgenQcE)GXuy%42X08Fdl|d4W>y zC#?CP+}9o7btLX5>~`3hncWWieA&E^+9#A3;CEDi*NyAC<@49BOHy@xMMDd{;&vnZe@)7rbg5+cDPmMiKNWBr{gZ@_H!`)9n z+-Dwe&hh3OoF}kd;?Dzm>qbR+;8?_c%2_yuq#xy^c^CE*AipQBFY3JFfN{?Qo5l4- zo5l4-mv^3@x#z|&l+6R#rcfS$-%0ebHudebGHP4rZK$^m9is4~)JR z?C12i()A;59zZ{c;zKu%>y|I%!_5ORJujPl3?+mQ)xICTHw~^m9uw4|Kd5?C12i z@VO?aU_I0-vo8htpud&)ka>V{pLxJM+sgx- z7toIQ^FYk&LU+8=yMBoBb{s>}k8;vM9-x$YVCtr8w^|-J=JZYJV@`jwd>%O5%X9vC z4}M4WbKN+uTb}h_k34Y9>942Fg!FS;@%cp^F9!QL{jJo`-8_JP5XFaX9M>&h$Vc3H zK=LuRzQOkg{vPCm{#N3{-5)^Q_wzuTmj{?1*e>zs0ln*oisl2iA?{PI!7(KLC@0Ok zu|EL0bg#41AG`O9QRM{m4S{M=JE52Owa2V#0}0{Iw92p{=+ zsO`7x^Fco7ZzVq5Jb<{*Jm9ore*pP`R>YqNV!mGJ7Q}tZn{fno z=WZTAKZxQ(H;(I;FXSWcJRte#P6!|QdZ_KU)W#qm^tTcpG7m8BGY{Aq%OD4^YZ|;-0gHBHyQ3PM_-Exlerc%^TZ4b<$2{ z^FV4^C=bBzsD7>+$92oIUh1(=eD%#++O352b5rs8rK8UU`#Jrsv=8X!0rZC`K6K-_ zZuvq!+&mEDKC$GZIU#(o9%_}@XM=pu-%5PQJixfmJYXH=|FKet~|+b8ZA%lC8lzB2e*&HX}dK0tqn;zT!|>y|I% zMCOCI-fuuo#{Ssg`vlJfIibJRa3b>p^8oXLX?b~p`GV~edtPYKTPNBQo*!I?JU}^w zV@Uc@PMW{OegWif#dEBecF!L7`w3Qw=UBIj=UC63^{vd@S^rb^euC5ip}YXUqx!pU zT-Pnn`j0y=w2J3g&z*Hu#z{zjcgEE6!sye%{!V|Z>F;h{K!1qhL^rPMmM`Qa&b&ZQ zh7!UF>!DVe-4Nu2{#L_@yMKT@z`Wob?d1jL3)&NVUYMcxeuJXCa4qrxq5jdDeg2c|pDpZQB0X zjGd7FZY!=Ebvza9@AS8t{_f@l^oJ-;bmO{i`9e29lJ$;-v(4P47LJL*bB)OkZlozf+9-v%>W5}qJ*vJc%P2zoM2MruK?s=g@ zybrBIybrB;kFRB#_xO6*ypWn4$_wy2s=w>Tb=~r8hq&`Xhj<@a^ByZRRzmu_rI;5+ z*9ZGM{jH|IyLkcqA&L{-xUO5ikdrv`0y$|;2q&zET4nZ+K~CszHJrHn3&;b^3)W0e zALk9UC-%HBRd0WxC@)-%JV1FBjv?tsIq4uTP|AJgpRYP>-17qWnOAJSIJ08&in4hj z+Z4(R@H?u%>&A86@~r=Q>@%;}d`ZSkNPjm~??-+j-{0l)iRf>oeMC1OpdUo>p&QS2 z%NOz?^MM)TKC|Rw?1={7S9mJdmcC_=5?bh5%(#x zIEJJj<)rCgKLJwiGp8OnV%+lp_nD7>?9$Bfk6l(a52W@94V_(TQ3F+sS;y&}}WBGnA_nGN$HRC=vAD}-(aiSZ~b;}oW66gGYoD3y|6V^km zGW%$d6Z%^XC+_?Jd4PGrIn2|?c>?W;Jugh1PSrKZvg<}yAP-Qk#4%*lNi5_8O8Fj~ zg}a|R?s_=tuLUzwkUVz_G{k^Aw--C1SW!Goyg!Fe)@jW;lzYq3z z`ddwZck=@JLlh@{4g4M)$w_xYIEji|<^DZ28svojR>O(ApMX5TykH*c>EpbC=Z!rt zw8Xq_bUE?>-;CEDi*NyAC@6Jn#^Mzjr z`#b%uroX#+0sSG06WzG3TfUH!IP(HI8A=EztcO}<_Q4=0^tT#L-2DaQ0p)gz%BChuVHi-5=zG{#N3{-A_Q=XC5%8 zd3rccpcS#_frDmHbxpGDKJx{L`;>3uxlNE!C$W(SC}keF_2_>a_xSGryRz64KAjO=@{ybX~BY)89({+|2{%2T^?J z#&O;9g?z-F2P7ZO3E?AO54HW4y*J1Q{jJ1@yMKVV&pcqYczQT5pcV1wftas1+Jd-G z`8tjv=|?%~AP-P3pKy8Z>3e33dmd<+_{Ut!#NXw5zwzZv?>FqSc_2F}ln3BI4__T@#g`({eq%(q0NZ&h$Vc3HK=R=vgpYhZ)b?BU?jRrZw-O)j z{s7`W^MG@pr-$y|I%BhEZPKFkft7$@ZGp|;;rBSAjsZzVq5{Q<;% z<^l5nPY>q>v?BgIp!c54qU(oVK-{N%9>-53Ed?BP&yr zM)o;lAhXXIXO+zZsk1|Q0DedHbKN+uTRva^@#cY*shvcfosk*)Z8G|~t(XT!*9QAJ z{jJo`-8_JP5XFaX9M>&h$VZ%cfPB~q;UixUwf&a8Gsp-1t;C1BKY+N;JYapu)5CcI zt%yGl975GKN$wLDtqW~L+^2jF$B-i& z!%7Gr`Fg1Bx75#re9+%Ye7O4qi2KX~&Ii0az*+ZazRih~h&xp6iw`MzW{NcdBEBa`vu4kv?BIA&=T{0!5gBS z9pnMZ<<9Bp!`r``GmODDu_`O#adX+2Tu!IT-#h00B;7IZ*7QkFZO)za)C=PLr9at4 zp*#S;qx!jS9M>(M_a@#v&@u0)qRw8c(2e7| zdZ#qd2%i(Wn7Fy?f3 zF6`=`)wi%~Zr52yFYa8_#cxz6MX9Otrx}Zv_I6D(rnI!w`j&&YO`KqS#h73e%?Cyi z_bDI2@xz{^b>^*KJzidaX|}!IC1ttK+i!kt?Qq`-Vx8z6;-`Ebkp48y>6HF7sXb{g zY{ADw>|fJnwElP682+v}_jPLx-BFwoZ@K4Aqea zObp%fv}2-?nds(&8LfxQ{wgESoW2F8bq%PVVU-xyU7hYu$asPEP^(P+B+rSQH`3p4 zh-Z{Oi^QQzKF+GpOFeD#eOWO_3$LNoPe9+%Y z;{{_mgC~5aj#5b;lmTpK$NvvCIqq6dx%=AJOykpTd8adBfdr#=L>^2xnjHH)DRm z(y`7Xrn~cq>9Niu9>TnV@>L@*~^3+qGdBo?_%?aUz^-!zq_)(q{Igg;fk@E=fKt6b0 z6Ws7vcOIZyo_2^ka=m$Gtn-Mj^iZSkKV2W>gZ@U&Bak<@&m%bJkaGLHL-fb(^{`FN zLnV{^F$~Tjq|C?8;BPwf2+kWgk1+Sa^+}jt@JzAJBWAesh#5xh+Yv_D{fKp#H&Ffx z$4;4f#KOw+h*mL=X!^hwu@6xFJVNb?E7mY2=Mj6PjloRWc|_`Sp?L)S4(ESrrPQ4V z=$5A)^_fRZN!tm@|BmW)tJmf8znn+V->T;k=ojR~4D}DTPh-y`4oy2RH2D7X5AvMI zc?A89oJW8M@xUf*h*_)}45CyiJM$^W+E^{uJz2lGGu zt(5=Qi-iUg{UC}D-Ro0z%NOzy=k=}Rqd6gb*<=z8c>sP# z^>f`gu3Mhoi2X)GUf*iQblu{{A6+Kut37Qdq@UYQt6krkT^;P_^tbdnLBVyc=m$}J z=*Dr~@_9a5-TR;8=40&djlGW4@!cRF^tTcp?)`3v`^*E*6J8$RynyWzR~~3vd`eH( z5_yrbS|%vW15b(g&mZ%4#C^)!a12R5s+B){v?IOrx?hTYh01vV{gT#~T(>;EjXMt*tFICD^`5kokbdqc=7H2T!G2DE zEA?}CK7f7@#fNSj*DastBi=kfK86y)2kW6$Il3yy2mP(Yhs*dhG5dBjdgKerU~K=#|geolWY&HLRv03LikZbttAH*6e_k6Q0SWog03^vwKOU7h{u z-k#cnLtc&etqyz`dyI4^g^xGX=8GLy2l=4CK|W+WllL~9f4+a88+h>fxCwlO;)utG z`klR!kE7ziqaJ*;zHh`z2p_g0AF2Nd@0J!TwB9`~VN+gAHeb z8ywJ;yy z7WCE`<||*yEBI(z+_!v*+HO>#HQw_&&A9H585DCqU902b#pVHL6J9 z-`m9+#ku0=1+j0*wQ4EN>o9Iw?a4qPg@dnuqrljX|+Kaq`3?jaC05j)R}Wz1V^CjH%)0 zt$0s<;`geSvfhm2i`H|hE88my>P$J^ekK2D?0pQu}N6#Ipz0t z%k!KQjA6Ik<9ZIa;r91k(nAfN*E?3`+g;xGLVv5i?*&|t6Sjv5et0~$yJx{^OS+aV z;~#32y5;kybG-Nv*Z2>L?FQ#0^|d@F^1c`P8y^3Ov7dPIinl)LUblwv9>;&?25dVt6y-rxK|``+KYr)(a` zW>3o!#2roREI*{6Q@bbbKY)&*^Wa@t&Ip z&<~>c@bW-SNCdtdS00epE5vyp3;A#oGEN9oY7GaeOM`sS-%5PA*R3J$GY{C$;JP*B z2bvI99yq>BT<$i|B?cU7TMuRPz?F#mlvx}@(vNb|ywB^GluZY_l zqx*j)GrIp*GfjhkY2Rgd$Fl2OskTrafZtL5yiw-^qx)Yb>gaCy+|q`JH+%#>?UpBLxdMeGZ{O>CN;ERK7N@GH5IjB(c4_~(BDe)0hbT(;PY`A_z1-jj}P?*PK!4*^-n|mP`?aX+`|GsV!9vNiyz-f4<&>T z>v^^KF?vyu5BeJ!Kfr^}$EDx{+_2w*59I{YCiv*o;DUC= zkPrGB89%^-&&LYz0dCkX9v|uroSrJiAJY*()Gw2-Q~VfAHz$M-N0EqgU^QzKEMsz z1^Gq!28gseS~S6x^%;N6Oxp?J!%}^|?*&0V=x=2F01rMNUj`rGhK&P0ly87&i;0i= z#E*T_-3j5tR^%i5g&-gFH!^;J2cM4%!3Ver@}V3)46OGUy0^&e#QDox{`Jt{dnk`q zyMWVOH`?4jl#ut8I*R#a^v(Rbm%RRs{(end`y&2d_!*QJ!1?QA;KApE>xAHj1ra}# zM-XydvuO^s>Bu^)e;Bv4+X>;reo<|HoBc8_uG2lB!5n&5`V;A5)l3P_Ca6^QkE8<&s4 z=h9;h&d2C$K|bhjrTF1qe~*1t?z5VI!S(mpeHDtXRbJv<1lQB+kUiCPuwJNil^X)F@8T7Yw9w>NjEO_wwxW&_Bf*ac5 z@u5Bs{YX=j=rj7C`tWi6+UA7tVJY&_@oJC{`Wwjyc<}kS8GMA|h{uQ8HS>~+4>uKE zGNJ@aefW5Ot(}l@f~m+yYEzI8`Wwjyc<}kS34DMXHloLe`gIxy6lFSUu1(g5k5sNZ zA$-^v&(v0HhB5kbkPrGB$p?7w`M42$fE(I@@rUv}RE|HII;l-ZdiR6J_na3w{x~#e zB_zM7)?D_bARqL%(mcbRhk^&6j~l=TxS>7ZLwNuq#~<4+A1CFkgv1ZFN3F8s#SkCx zHr=iCMG;Mzm4lT67Kx=(p+~!@{6T9{`gyv5BeL)2iAMYhZ$P;As^e$I`~Me_m_KX zMg#3;gU65T^Fco7Z|U)A!8$m2ARpwx1UEbeAJbGX^x9_E!QC~*^=)I%C1ZVz?NO`j z_-l|4`WucP)GOCd-RBQr-J9#+&PF_c0PExYe(d+19;~)<%==FN5nczs*7M(_T#aK$ z`cY0=_j~)7lym;`qV(!tn$*eAvL zOMkM<^X=`|pFdT+`{n1p?_N=7$Bozt87G*V)%MF%8}sch z*TLy;xStn3Z_4EZ{UC}DFAwBfsn*|g%jeG*@AC)9$54akfzjuJe9+%Ye7MgaK-^~@ zu%E~C2aq4wF7f99wGjvNz?+$92o+>p%WHFlmZCVke}ZTZ(xg`)t15-8=w)EA?}i5A=g5 zK6K-_Zuvq!;(QK`%mb1SCn0>~>!G&aI>v&0(BDdYxX&Lz+-DxJUcmDQkRND8T-U{j z=aA3p>si)yROf<$K81_8Wgd_}{|w~;+DU0%jXVI!zuRj{Ul+rFr~IM)Uv1xg`oNLb zFYFK-x#i~r!k;GBp(a(2ct*+x+iqX*WAQxl%SMb5d=WD#+{b&TzjA5j^j9v+T(sf5k&8B* zQ+~X6TE4yAeh$B*`nm3SO}9MjKkobVPJiVqqR!48X--H#w>PNG`$wP7x4Z1;^tbf- zZ^89%=m$}J=#JNP%NOzy=ksUDhnWyQSP!+z?1ms8^tTcp?)op{KJ$R{64rk)?xP*? z=YbZgu1S{716jm<$}4aT8Fdo#0k2gT#~T(>;iq4NEf1N>Um@;fK36m_<2WT@|5?)B_d7u-r;w4YMT z107H0+g;`X`Wtz_CHg@WAG&c|w>+Ce^5N!zlK11P^I<2157tAiGWBGT5Bgh)4|n|+ zai4j>eg*5l$Pct5{yd;|M-1~o(R*pJV3d8?LoO&*?%4P`M~I>SL8-NePM3-!hw{U|3L zdvij@d-iK;>q4WC<=b7puay4seWkmH>Z$1ZK=g+wPITkBZh5*PIg$AwZcfaEaKd`1 zRc0RzazcNr;l$l9KptRTa9+oL0pzf=TTWlFSQ5*9qFl1C(FJF(myc zC(Q@3UjTW)Q_FI>+a3_lE~%Usgg@RJDat9X@$V-;cU$h{=WfdFx^AD5UDxedetvLb zzTMrt0KcR9yKY?9EzjzRd!6Xy=WY>ow%5qmSTfd$tk>1@LdWm(?JnmB^taMFfXfH^ zK@=al@m#ljAs=zB6Oj)mA$+hNYL%(cARqL%5+Ck<0pdRMfV~C#1;`JyBgQ;%#_gqfTQX{!_|4u;ZdTBJ+UfOp{0lQD>;`-p&Q3_%NOzy=Q!DVe{cVsB`df()cfSB}pLxJ~6Z-|o540n$JTRxb zb77apLs`q_ftk~~iMBhK^`V-@ffO(+zJ)auseNTn^ zM~~09x7*L*cT_*ujpMrIS^xEz5A?oA+&`L-@t*UB;(XxYe7nm$Kz}QZ_gp^E52Ek`L1+*isJkYlIl%B37 z1In48Y#ulaai8)K97EENa?(K_pp#+~ouPAc_y&IIdg1 zkdL_YfaGH+A$+hNYL(dsgM856N_=>Ez>E9L1NIj0nDYYK5mz2Kwr5fIK&_jCG(yO- zdEj8geaaa)hAdD~@>lcM*dKtDd0^jZa(%w?{($RGlZHbfYnTTz1dxaqk<;dH+Z5?HX|s($6i$Jkaq#zTM@%G5xJ(KhWg_{UM4I z-FU8BzK|1{58~Q4CMVsEJ} zz59)eo-;NLd4RG7$B^`+oV1V+CNLQLi)S;jN<%YUB2Dr{DA&e8vnU`pdUo>p&QS2 z%NOzy=lp%OD4^SFoZyl~?ov55X<-h-I`klt*+199aqHHGL-flmK-%g56E2ig&T9%!NJnk3hWik?68VZ?pPW*kFCoy0*Np#0&Z z9qHrlJ2&$Bp(wpI|NH8z)5hv+)31N?&fM$Yyj7gP^e5GpZ*RAs!|$kmt{ca7%hQ|K z^T6tBM4kO2XC|bdTYpxZ5BxIU?lKS1-%9=5+0I?0I0C+N)B^=7A3)?o&?2F(mycC(VbjUjX^^ zGp*@WpFM5d^T5U*tw?YD(aQ9i3vbS?x$ye3c_4ec=b!%`R`?y&&voOtZh6*!+<9Q* zk1i8+c4KbrnPl8gU@GQ;j=O^Woc>no=WZTAKZxQ(H;(I;FXSW6JU~92gz&+7s8yy$ zf_%{5N_@Ec1Bm;~1I|lc9^kxycEp|srt3X_zUcWw`yuXAHsKhOew33I;y+$92oI{^QOAa{X84fuV%-b6YVFjIIs#bNXAUpSyVg{UC}D z-8imWzL1YN^8ooUbIBMdupVla**k-L(BDdYxcdW$`^*F8i`XAPexM!k=K;O-i& zV=N(jupVla+5Z>hgZ@_H!`&Z1+-DxJUcmkU@&oONIS){6&64XvMf=3>Mck)M;TSUN zL=N%*<$LCQudSNvNTc-D`tPf@{H$&En|rlKT}PU_Dc|01KZoB@{aiPW>y~GI#C;v< zsx7a!$?Hh%;e_M?#rIKloSScVc^xVJt>*ebmlO1dC{A?axo-JFPGmla>pD_$GL#Tb zSP!+z)aQeo(BEn}arX<52bdS^=doXad_j9+&I?moT0TnEHA&`$qWQt@$ODwS;TSUN zB<63hUjQld!f$?HkNbWB^TO?KKA5}xO{e^R!43I#cl$g1j_U8aab34O+o2wL;r2Jz z<(!1{cT@GbbZ6(=-Mzm6{#Mi9T~5#+qBzlw>$>F&If*+jNKVEQ!U^l4R+&93$O-+e zh7))H0C|9U!P$uY1LO!|qnxym4=CmHO22g4_~!*a zuhja^gE{LvhHR7UAH{zKkmFBpI2&qXI;*`Ga2&*OEE8WoSAQT znHT79HT~V?1pOh36WzG3TfUH!IP(HIX-)_ytcO}<>Wm;K^tT#L-2DXP0p@d2;V7#eK-Hiu3N7FWi<^}r8{$8%$>?;2r4Sw|LJbG;fByI{2JI`+rOKcXRUu_dR%& zvkzaH{^7MVS_MPn+usMDNE^fN<uW!SA3r|DVPAo5XSOlUki`celU8fA)9tZQj2J zOBse+@9N#%IC9Auc;?Q4*0Xme8m-0z@jr7$xW6ktqDa=8u_@Qx;Qc+jEZ^?#{YCJX z`$M}OarhCtil3dukKpGB|9VsK;PYXkzknNZ;_-2i+Qq&?iR7cLcWHO0QS~bacM>nQoTVw=x;E;7)H_f6g>ER+y*|t z4I2l1sJ#?VC~?Oh0Z3|ic^ZvyWgYk!o-txII3J_`8RUchM)Cn3d_LBI4{*b#0Uyc( zkP}asm+o6~Mpyqp(q`SfS$o2&JpudHDJiTGV%%b=K9(+Ey zP6%$;F5p9X08+?@au9NjsRJLaM~>JH&PPXgkPrG>$j1+cnv3}W59EV9nBa!T9v=s* z-TWey%B7=ZMtPF-M1##=v)bA4>^xRIfR@Zr3w_FRtCq97miw~!B6!A0={ z`w8U3yvfTiXbfL?```1YsrLP;#=z3$3d@_m0sb$;?tYpX7a#7PMC)4n$z)t-;a5YA zzl?ST`JlgHKIGgbFn<9LJ|8z?`~hxg2Ki7OfaLdIs8LPI`E9KC=eT@av(|j7vH8d@ z4DvyLOV4i&!{2`a4?Z6^fR9idAs?y(ko^9O8W;Ie-ur^%jUOA<4mEiE=vWZsgZ>uB z53i8pa1-KVhUx}x0Uz4?FY)tnMy|WT<44DT1o@!9k$iv$pO4kx z1Kfo9P|YuarFAM*l9<25nO_Dk$yp7~N9uDyKIm^azZ9*1fCrzCYrqG%VH09}Izx5+ zqj>*?nroGH;KR5oXE!(>qn{1(L4PCp01rMNtH1}iVe63()%B0U^>wv7$!JL(_!zuC zH+H_~H_y^&GJ8^x5BeL)2YB%Lz;)RsxM4k!57qH$As?zS$g`ymd>G>SMh(tK$B98c z=x-z+;DLOQ2NT@z7v$Orwc#E1JF3*48&`&8^_ z@Ei-=zrv=B>pqoFoiKOy33I8ncDWz!OZ)pf4dbcr?R5ly%&U+WuYg<`lsuF9lhXI8 z@ZTw~wlB%7dT>fQ`_a#i?|mw*zs~fY^t!w+rOhzDm^PYzlj%KYbJ2Y&*;V=WcJEVx z|Lo`Hm8J8gx6i6N%MjOzp1q*AYkpeeP8Y9+V}H(_s5irykhT-j&#lMQ_E|^g<=b7} zr$T=t=b_-i=Oc^$0dB~>$Hz3)Gyp!@wD}M_Jn`+23AOmqF*nEu{f&$t z;DLNFUYOv9$A}-w3C822ZN4ra^@$%Zv^6J%k3XpKk(v|agZ_r%NAYz$7;lC7AQzOF zXDDCCGpDR)PfF6wgcYF@^(L`(S`Jo)olc>ZuX#zTki>fNt? z7~~f>}vi_t&TnA5pXVE zC{sM2gyX}w?sGRpy|s2_%!I^u>p8Xfo}HaDbDK1{{4+c7v($Qx zKQb9RA$&N`s^ypLCxd*@-^lm@9(+E&3_idOK|uUaPB3kPk4_CPXh&V*hjDnOJ1Kl9 z#*dC;f_%{5$oK&sd_FD&AK-@V0zQ-%Fw;|&(V_{itk3vkdd5l$A1|uKkJQmYKIm^` z`~VL=9~XcRaKpv{9|!ZeR@oL4A9aZzg9l`q6T*l2k{TbQp9u0neJXl*5OC^&X?23Kiu}T>p4W_&IJzFHyVAQLcZyKVv3@4{J<~kL*!FKIre)CWzhR zU|S6SQ(Ua+?~j28pAW7Rf*Te^{7@c2$aT%8In<^jW8Ob?*FW~kjQu|^Zt7Sz9%U`X z_|b7>kPrGB89%@S`Jj&`xZyGQP`<>{Hhh}@G{KbRRx2p@h$)cDJ2dyo(MTY7vddZBn; zw7dTT9>@nzYl0gdgO91IOI)!$0@5`m=KGi>AA@IS>;~r}+ZN=5{#J?~?)w92EKU_ZIiXSc?Z>G%#=Ogt-kPrGB ziXVaZ5xDQA!MKs*Nb5fY@-ci*)1p_;7jH{(ueX$Mi4Y^GqZf+{)cB3+q$t%g ze}*Bi_L^ZRypHO_V)XG9@$-6k961H!M#=+m{Ndm@(%i6kw#>ukrw(@WaXG7pulW4h z-_81)7@I_nBU_rhtJj*87jXhc+`iT@#@dah4~y&d4ie+XtHtrJ+5=w^2dOJU<4E`& z?&slhy6=(FEl+#od#L0%(vIsrREDUx;eX4FotupHNLz6|a`d%)KbP;JqQ8~jLsjs6 z67&mlVutz$+edfZNVh!g5bI78V;wITPqrI_(=tv%IAJ~1DzlsOoXGhG{f!(ifCuuy z^P1p>$GYoAy5(tym{ECr#5G=!d>9|e3^h0(9j^xYpueHIFY{uWTF1TGW^~Ba$x=~{z5yq|J|$0?e&nT zdLY|U8peI=jy-}uo*TvgmHXXdkNcmYeQ)_i*@gX2;lImyru*Cg%o{k5u-D_c0hnK~ zaIEu)>Fzv2X>Y9TJfa!%2FefOcygI}#OEr{BmVOHbJp(lc?9z2_IZRm&%oH)9jm$HHNoZf@wV4Fx7Wi~ ztp~{@f9gMv;JktJ2Mio<|rf z&Rl!L55+zFHOwQF9AX9g@;0&m@SNC>_@vm6m?zGEl{j7}*2sdN)K^0D2>2b&|G`p* zp*s)IEl+#mpGSy#8=jqMPDuWDo>9AQq2tAT{+IIz`djrp0{w!Vn4$i`_R*aO=$5A) z@y{bRi2aB;88acAupVlaslVqrk@E=p8##{v59EXAHNg#!b>{)Pvj&#;*LX>kYf9O9#NL=UP`($(sWS73(<;v+S~o9W`^p8W zs^$@_qj=;RF>lz|Zk+ttjIrueasDgC@%=^fi0mbyc?A3p=l`%xy7K_t^0X)Zd4#OD z&Ww|g{BJ$3Hjl_YpU?kt9zlPro=2cxkP|c1KiEFH^8nrQv?Km`#Gl)Z;RTtYgmA)o zs8x3SHP4BhN6_EMc?5VMA3U!KZg{La56~@7JK~>52tHc>BV#u>AE}K&KIm`cJOX)h z`#fU%ya0W$&g0?j^{iIU<2#Swyn*uw>oMFPfqe$vW-Jz-u`d*`yAWz<`%BttXGXE;Dk(S?|ltSo3~ykAx$}@y$hJ z`C4tS>idIV8`*ee&xkSjP4Rr1J~5a0>d3~E7LSC>rtHu>0{%1qo4W<)Pb`o7D0x`3 zJYk+O(5L$_A92Z z=qKQZKzN*}-|-`E8fp^vLe1$pM`g8uRv5-kMyp_Df?>w>+$YJ&@D3R(A)MrEqPE|% z&*nLi^9cG|_}r%^Pi64APvF7lV;ArdiYFc)%C}=1ElqQ`T|SIg)6EUeN5@!@5BeL) z2YB%L*cp6)8&c}=q5N1uW9qgXKL-DtHXEFe)H6Xo=x-z+;KAqP9pD4p1o=?DU0?9A zEys^X(qrc|_xZj;Dfr z(BDWtzytXp4<@+bvB$@>79Q6sk6hAuN^jSvPCa#5*Fddh3%_5N`ODzywB6u*q@E1& zL4OPL3-8mD(vKfl_aPtVBrm@dwu$^5&x28pA05WP(&buY(4x4XD=5~ET2IMzH#i@o z>w|pI-(dWZ_j{f%?)W@E|6F76;PWvN;}3AdR^ju4R0GI~RHQBIz=v^C#%gdrvVRQn zL4PCp01rMNGrjfWa2z2Ys?U?^(B^^)>cGeFr!&nB&PT@+K|bhjBp=|x=i_kj0dCkT z5>13?7{^8=Q~S<3T>?ZzLb!!RO;J@BwbZe5kL0P?N44_MUqk+x%9JKiV>5 zXE*rz$74Z0=x-z+;KAqP5byzR*qV$Vs?SP@YyU-ztmEgyI5gulI3L+ZgM856NIt-W z&&R>w1Kfo9P~D-6YyYJ#dCF|;iI)F)7{{Fj6M?NgZ@_H!+nkw zuJ7XYUiRtLM0(am;u+t@WO1MD&EnjDPS5&fiT5g8 z7`omI{RV*Qu}u>HKAMal6Vhgb z^O5>ZkPrG>xR1tI5ZFfp4?Z8vv*3nhz=!g68iJ2`oxRKTE)sQ(iTVAHZhjeVA3G}< z>sa=aYWF3M{yNA9{jD^PTrWT|!2|gq4<@+bG5Ap4XFaxOQTISorl-Ga!9Y*n5~{6P z`q!I(to3mDegyf3hdF%J8h7PEO3w_?*Q#ALVhaGRFH>V}1{$e1FfC>7j&hQfs~Q`yCJDIdSh>g})q! zi0=jNH}kL801xDY`b==cWAdT8-x}Y2tF1Awhs(L&#c8|2`AFR#y{;%V;6tC;(7(k$0i3qGcxJSUBor4x8{u2 z|IHY~b4Dh8bhqOB)4mW|uYmvT=jMKu)+-KGo^OcjD&n~;EB5#Nea5>kDd{G-}< zVRT)vpLfIGO8wj&Pl5-Zk0$gNa6^7Eo@`NF(TeZ73cM#YwtaKKhrBK;A$(Yhd}Qwp z@-~J;!rjyxcc;?~9L<4|!cyLijM( ztBp^ycL({Pzac)_i|!i$4?Z8egAZ^M;zMTx^mz5AcEJZ##?h5ijezE_gm%obWV5Ask+x}#DBepSRWgHXQsKq`52w) z?F-2LF}aUMf5X>nydmyteVh1qe;*Az_Go2XzclI$KgRf=x=2F01rMNJA)5!!-n+Y$28^j56OomuGyeIby){KjOWu%gY%L4 zSdb6;8{}hiThaU$JotQ=-~-&S9X&p#YsHV_I+vYBeX6o9`DO4e8MDFjOZMYIKIm^@ ze%TR?BDS#e`2{@qd`to#;D+sp_@TA_vCWP@1|LrkHF*3OJv7J%{Vn7}wsq0?13dVA zOavd`Cd7yG{8rw#xb2QVZcleNI3FD!4e~*MgZZVzb63EF&&N*S1Kb4pn65m(m3(Zw z<g=HS8S<1Fw2ZbE!0=NHMx zHak8wmZ!&-H~9M4v>+e!H!^;J2cM5Kzz4Vq@^P?oj*xt8yW`WjX{W*YNKFm$L4SjM zoLhYT2YB%L7yuvOCdkJO<@Hm^$F@5@ot_?Qa6U%=EyxG`EzB<^$EV=I=c6BdfSVv6 z2PvX*T+`1TMf=f>cAi$^f$;yiS;q?;PcT7 zKEO?okApPEr*pUA@yFrq%?-}S=!b)R(BH!RQgZwO9(+Fj6MTT1ARmV+#}De!mvvYl zGfr+Z8=Q~qhk|_2-(dVGkzc@r&qp`-05@z;Z++~e%Hz|PrgU%T;-%WR(bZ*t-^kuM zHqhYfAI(8N=x<^Ckk9#%pTP5ez=O}nso(?LcqI%2d?>GvfsYfZPgT~3kJ)RT2InKS ze~=IQ8_5TF@cCE>KEMsz5qv1mUs{@u>*??B>(>n+_2J{XwL=Zg$LI%we9+%QKG@cQ z_yHb#K28B2;D%*9J`PbHpOO#V08$@5HmQwassyDyY<-@4U{kK==oCfD3wNH=_`Wrbu1rOwdJec5y z$KLpK>QvSD{!MS1-Pf~Z!00!+`l(Yz)+c`4kQ-`nK1TNn@sOKA&?kNwQ7d|J) zf)nsV7|6*~9Zt5@cyjWpOml;CGP-+^6Z%^8C|u_#9~>ch$UuVjWAoRiUa1v#O=RdWI^d`{ZI3HV_H`J5>30O!}&s8LPsgn6;~ zmVZ4o_&%|t#p<2H$6Y_UBx5%?C)r){oXF?f(ci-LHPl}4{$23k^YNzl-W(I$u*Q8p z6kh<*(sXQB|I(&8)Tb`JbrUnT=W~nowN)2ox*MF2j&}z6pudsp^WeefV+;5IH*80r z55*N&@G+PA)MXv`82nM>nM&A+SgZ@VH0UpQ)TipaVJofoeT$cwQ+i3haBV#r=AKAAD`Jlg*_>k`*&TkKOy-TzNcx?tLGcWobJwrUH$Scv*L|{M=$PN)WvU9Cq=2L^QVfZ5y`g^ zPHAbWb*bcS?Qb={B4#tMhu=fE8F`U%6OLc@B&{=V{p#^@Tx;(Br;_g@M9zy94%furO%ZY0s+Kkp4(#G(JIQIeKc$c=Y?(E^eaP9Zkx8QfUpNGqN zZv_tjwfbY-@;uW7yoWHheOg1*+u*I~vD1^WzGXkI_MVrHx8?h}+^40#<>sSaeGeYt zbAoaBTB#2YlB%4i;4XTksrGXTd9n3r})Kta0DEV~^lZLB|OED*Ll|{l-5_^lQ=c^Pj?hmw7|Z zBRFs1Ji>a|n@4bd!P0TP&pdthg5EAMkx*RjGWb68SHkm%7cpL~7zCPhpIlr(VAO6j|GWNgzT#Vx@&m-thY?F!MlQME$)i8EW8?Eoi7=!;I-f8|N zaUA@l4h_vC;6L-f`9jcdmd5qKJgiwZH8r)>T&P5WiF}`VT;oGoZ-aNG?S$li8=RG> znu>qQ?i9@b^tbf*uwecG9(+EYNB;mfJgLWrYVS0Rk2E#4Qf>hYm?(S%TPKvAZn=GtUk_%K$cn-ju^y;&`Oj7|*lL4PCp01rMN zW8eeau=OzhP`p~gFy#27sgv4tWX#V~aK|5COq&VeL$&6z6M}ru-%9Hb>*YKHJotS4 z8GL{n+5nnlm{ROWMaaD^V_)A zw_QFar-u^4how0F=(s(|2mOuY1M5BH!wjwakPlohp*;Rj-M!-ZDdqSy*8MTLW+dJ> zYbS&c)>J9ggJWI6LHwS5_{#LYO>Y%rlgjJh@MoZF$+DhP&*oV){f>F4HO)UKz=t_k*Y`dg3(u=gwXgA3Nd!2|gq7bdvjvF<$7%LDp+7;%pyB_GD# zndXG>VJY&_@v|Tw^f#ObitZysyd)oHC~lGuj1!dSp>f8KSjUkv<_@=J%!Kg4_NY~+ zZVB>1e+%MAK&5}36?h;Y{E`W7c;XR6|cw6>vZJRHy;lAP3zFll@t9@ zeT$A<(s@d6jhEx|^uCP!{!eJ`Ueeh8Jo~@FeolWQ@Bai3J|7REe}Ee{4D$ewYn6hJ zSeBf`_1N*QH^C9B!TIR;QIHS%TY8*OFwX!FJ|7Q)k5C)|AF9g$#!=HV^JjH+_NRM$ zme$Hv@cS{}{|V(zqmL7Q9OQ%khQJwM5()IR6u!i@WB} zSw|pI-$*{dgU`pWzz4Vq@u9rXDaIc%y-=O9tk?K-Y;j|cPdjc3 z@at#ZI1SE6_J$xI^f!_Z@Zj@tH~0WI zY)SB;yw2&~cOJtGre5=xp$6w;^tvD)^fz+;0v>!mue=x-z+;DLOQ2NT@z81X~-daPr67IhC~diuK-4D|FZq1M`^|GdSI zh3`lAo{XS+itYyIqhlz~hkR}U{pE8Db`Ld0;XGFc1@lpFfA_0mZCw1{uyD*`&eN0J z>qX5+{@LX|-y^%5cYMySuH=2ea^5WUu{`zJ(8u#QPk4H)hoSGLT|9kfl-9@c)aO8- zMZFt5`>5Bv3ijRT=?&Y*^3-QO=K0U_@Ol#KN!Z8x6nFBD!}?gB`Yh<d)85`n$5UK9;9G z^AD&$=(ErD{BoX#ee+VDzXyBm8@7+-sn3Ewo`?14+c$*zyP~vxEKhwl^zl4wSJtCB z3GH&F$4$6>S)TeF=(DI7&-F1kKo72CGvDSNhy7)F>ND}Y5}wD`gLW}Z=)KyrFRYK{ zsn3Ewo`=sHvJXeUz{84sn3Ewp2vF9E9djK3iX)v z_zUY}dFr#FkLNKF2keK?uD2lm^_T7+EKhw7^jY*9dT6KlpPnA`n$oME%k4 zjcA9*A$OkU#r@q&w=c_6p9Ot9j|n~G(A)|3P5y|hx2XP5p89MY^E^fRCPCkRrS-8q z^*PXIQE%A3iO|t&ioY&xSsp zr%2x+(3dK$kL9V)fj*0R!}WJC^zB|+AInpp`6tw0IejyrZ@1F=Sf2VU=;L{uClF62 zqu*W+`G+$37v-tX#xc)hLXYzS=y??VcYSGnEKhw7^jXwPyY>m`ySubLmZv`RNz@

lQ& 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 VQh#~B9{*_dQ@NsrN#GxU{~rQ6uD}2Q literal 3195132 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¥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

)y!nMe^>0g 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 gTOaAs$NEb03DU

CwmfG4f%b1n!r87Ffq;>mxn-Sg%ArLHL+&Z0jRE`gTow zpL~M!u};a>M|$+J9)o;>^sz3+)<=5uF;A0xs5h`*vn|gZ>u+p*q(>j~0?7w__zBM+ z;}o_&(xZ=gXyg;5kNJSMKGLI)c~9gMq>uS$wm#CMk9jua!}G`e^87K+&DKYH^f9l4 ze1h;XE@SH>J^GkOKt4hGn9pJBBR%>UwZtSLw?uxA!ov@p zypccsE?)m%Pp$gCPU2w$ zjrj}JY`RA5=dy>(-~iX0c}~HraVcZXudY?stBLz`!|ewyaDc1!jbg7UgBM(ztLG{k z)%nFnC5^pegYkh29N^kIWOy`o)6e~a+5IebC%Om5?n^{}cUB}nO_>95aUHm7&-Y)i z?RA*M8A$M;8eHH2SIhV#cr~sgB+5Vr;Q|M^YR10c)wqskfCrWOoi*N1&t3)xxOT1= z9>J?|nT@5r$x}Pl`n?};fdgD~-ypcKn@)FlzS3B&RlLblJAQ(t30&X+SNmmx3%nZF zkul%`2e|NG@M>H~$AAkQ;KHon)wqsji0fK1G!h;uN5Qo{ZJsYv?t9Bs9n&TK?0${t z@0jNpeUumA;yQ43N|KK2wY?5=l7R#ds=);gaCJ?24_=LH9OWuFz_t4=#?HoW8rL|= zRd9f-OucICrg4p>pWi>;tDEPDM!IodZ9dDl(!m}3hY&UUtcniQx#gj_e1#wjvlVp2`=!0 ztD)Z$uy!Bt(pkPeU#E!Ybj;3}RmxC~x!oo!T?GiuuUkb(;w z;40l^o-boJaNSeA=u4m0Ng$5~2e?}QPH=&@hii5|?o^3^w-AI29N^kLZg@0!!9^Q# zU?wqs48jEtaBZ9C3%ol1T06HougVJj+K$8?*?pzC@7qLjE6+9uJYQS~t|`MK*JH0W z_1IU}mekuJ_$3<&E^vTr$M6SUjccJ%U!7m8Y}8lM#}dRNIKb7K6Z?W!r#nA?>Fnm> zVkSLJLAbyHuA1Q=yn<_8zvU@?V=0Y6xWECf<_WPEcm>yjn$_%Xd;!j4!H>A zD9B#m09WhP2A9DrxHhWI`SaCfTWJdCLAbyHt{oFcfY*m>zM)>`P|2oa+T0^Nf&*N; z#!lcBTuwPLzrM7xvQbOHNFEhI_5ugEYDa`e@Cq(n;;&}%e0d-`hu8}o;F>b!J$MDz z(z*4;4QYMMpQ~@w(kuEIM+YCczyYq^SBbsA>&3Np{%p#qK;ueqfdgE{TLl+*y|{D? zmQ~yeGH`(dT+O=$7kIt6RB5rXu##>AB#1|FfNSO!!3AC$*Zg9=k>)T_5H4_lt8H+B z*T&V@OcNFCxe^}10j}b_*bBUSaIIw9S_2n2z%}zdf(yJhu5)TMyxwr{FYP06fdgE% z*P7?c*v-bZT3uUTO%aUN@BM%a9N^kE(G*KGFK~cs?z;sSc)hq*>#J2AQCPQ_>M8aD2e?Y6y$N0~E@$*=UX}W*m9?zE zfeReq;^x8Y#dT?YZDGBdp);z?!9}|tTy0ZM&_AGYtuIs>)%nWi#>(p2N}A57bZh-9SNEH!`g+!TPf3oaO#7i@{0m+5mxGJz zz_sYnAora6JjSW02esG zHFJmH0M}aDc00o-gof9+&ECYw>5s?#X)K7vKU1xVk3J0k4j88!K-Zs4LAM z!37R*Z5@^83%nXvO^v~%nYUlpy+^#~-~tD@cpky)@K{;D$D20IW1e?(f(snr;&Oxhyj^&t{LuGvr!Qr)lWh~9mrc7KZP*Q5TnDbH1;NGjPPsaU zasnLSY8hPM9alL44sf+id=K7nl@s6q*W6*@5xm)#6Wzl+Gg|U|fdgDTkKlE9%&?re z)(gsm3mo9$GVp3#V<{(0xd1NWNXie5E1Sq(ETHv!Kkx_+aB&Ugm`+(+FN@J?8bITp$SKHs`FDHpxd-gKdfvao!qp_R5K8^SuePI$@-~d<0 zw1>DacpPTPglvCT;&8fz*RKQBY4MEPJjbkloQ|`S2;ns050N4 z$`6fe9PvFkz=gfQt8tAZz9*gs*UXYU_r(1g*XDY4{(NKQtXdwN`tX9*@BL6ef&*MT zZxLMJy;eD-0;5K&)EJ*v!H~zLko{;Mr}XJRjq7Pjdat*!>vhWD2QT=`rkvxxu2qRO z{?(QBx|$#vd+Jj&WWP6EZs|XbORuHzUa#?gL@kWnRe#_HC%C(dVt4LG+x=X1v9j6N zP_v@c-1L|XG@n0spJ&_d-s{Eg{&nHt2QT<%woEy0?62`xmd@6z%gOMUL*D;qO@RVZ{{f!)Cg z?yZZ0oBPpel&?1G>*`^j&v>$c!F^dtaDc1UG|#iK>t0;*>-DA8M7CAg27a&?IC{9= zEV#g{6}a|V*j(ROiM2kZ6SCi@F4Od%#-*kAdTpCir|&p^_~^~^$8J7;`1Hv;d*wvU z;06D#iO0Dwzg;V8`tZuCF6R3%W&r*Y}}zJytOV+h5nSK^ z7gvK< z-;|)yVD5|sraut954r4P(>eRs&OTJz8?s+w?M)(eIt@4YW`Z>Pziq)7j- z>78l5uPDIW7w@?#T^YPz&!cB{-}RaMR6V3u#;j>O%XU(?s$Ea?MnzE(a{YA7-Kb6} zYv1c+_PM_AxvA}%edGVv;C<7g;w?NlbF*Cg6t!G@=ZM;oO#S8Wqj`To@s54icdYck z2ixh?=GtOqA%=Gw6D3WLrS(3}dY}DTPWN%{TyV<^?kS3dH+X`#E%SWCr>*PEN@H^= zK5d1h>A`cba8s^%<35I!@CHxth93Cj9C@t1zS>X@x1<`zd^e0tnx4E46dn}bQr^$8 z`_z2w^9Rn$s?5~&d;gF07hF*nP=8XN&iuX9r_{4{`n28~ccQv6efrGw>~zc*$hq&0 zd#rzb`f}NiwEQfyFX@zDa$m*mPxalWbLUYexKr^wZn+81;FNUxU-n@80*Cz$g6H4w~{Vz>kIB_*-?{vQ#-= zojzVkvL~{(sorndiHB3JpF3ZfkNO#$mwol~<-^J}PW#N>Zy8?Ux%>Z$AH%=>oC?qJ z-ye6IUN_RHU#gy)K56S7<~%E&XTCfiJcHBEvui<{XLyC@?XMPphJQDu90||y-y`SY zdCt~7%z0KkPdy_aJcHBEGh>T;%WZgt=gyCUU)tfdw%TEl;#*_#d9ks`=^7` z&$G*x?a%NE&&`hs&+zZ2lq19Q_4fBs&prNpYm#YyS@FE}#C-TOIQ={a`!l@4^UR+K z&+u>aXLybsh~1jf+PkcHF6X3v2B)8Amo3|$;T4{DpJw_Kj9S>_mN8`=I0ulO@| zgn!PF;?LK`j>A0l^IWB|IDLD)8EZ$1ta#qaNx2P9KhK3%sJWBsZ!gbH`h9)vZCKqa z&HIY3iyMd~dux=7=K$}2O}U?>l#_N9I4z!C1DPY;Z>HbxN}C-#lW9pv$u9H}8hb{|rJis_*GH2dBT^ zeDAmje8O+(uY_NCw{Z)x$T)I%@B zJXkoO#(*`d{_91yzeC1BkTY{~zH><=_Y+-Kj>)xy$3>#+8_$*cIeI{~)v!y{^1`VX zgsWJdK9jEjKt&F=X3o_%99 zzdY~o8}{5weGs4Er0KEhHH?#|%x^I#{DRZNFQ!pa*7<3E;S+wj2;MnI8h)HIo9~8^ zNz=P|9aAOtHHEa-dlhrC-V2*Zk|7+o)~JK21x?>f${MX7(MHbl-X`DHjl`-=PbRlSUT@ayKigX5JmmBwa* z<@JT6>0LHtUxc*%x-=rcW>`O3qIi&KY({TSBIbZ z+1a=g71QH4oB1f67YyF_&$h>?&*2xGets1ii(mMJU+}^^=ScXyjxUCk>G3qYjim3-1ahj!Y_UR?{@A^Z&KW#ODRj59z41~#MxgV<^GV; zh|2AmrTF`e>HSf_>FE#Y+usGB@QeN6opYqaPu!qODM^|h99i{ec5@O}gENd@>MNUH z>}X4eAN$K8&XcAmE6uO&@2aKjzs->S#>szNlJXgx9)5k0h`Wfhh`U;Elemj`%$G== zq%{t8^YVrI+RC!t=1w}lha8Ct8;9C`i^LJgnV*sK?bCzf3;TZEb3G2Vf8s9e64kGh zjw2;a4-Z+D+vS|ZUEuWib>DiK=N*2-p8KTZNJ-PX{K_~*>g9G$_-z`T9)2;6l5SiL zpYY2?@Xk3h={Qo-^x#lC+Go-q(i%}*?cT?5N7T#Uq}_xT@46hPKg86-)XQ@}Y5GG< zzX<7&X^lhet(S)zi3%HsntHp`zcULWJLmk8`w5cmrnGC2YTfLCNRmk=D4@-Z*Z! zk*%)>MbpUFYWuQj=SFO{L+6uQTLR@5y;|E zIq%%(k1ytaw{!2yO*u(Nn)e6PJTmMO)vuH8Gnq6! zHat-Hu*^3}d7sLuuO7{M%R@e0i2f=hw5Lz#~uIRxrb-_`L`7$Eq{}y2alRp zbWIlX5?UeepC|uuN$sD`dzTE(LFKphWB7z$aKk(2$l*pQNaf0;>0M32Z`$iIiX)1z z-TN5s2!6py`^m3G{CDbcZoTxbf&Q*j^UeS*RoQUOK`qor&gGc@<9_GQLu;cS2hAeA z`n_p5cCPZZC)76%ZX?Zaj-IRE3x`+jFwu74*>;}U!ov@pypccgiM{`yGhazP9$cG~ z(t8E*JMlX4duvI z(`fN~f-Wc^Wg>~+v5Q^r2W6Tx{!W@6Tv^5Moo9_Ees8TNi{HT+HGb#0hv%T@ANwYa zzmuj1M^^EBF(>ni!5J36!zcV=KX~UHnKb@RnjRc#ewx!hOFMq=B)Lt6R#7$PrX*+cj9_)8ht$bbbCGTaPt+=ceJK9 zMypJ}vU+j)s9IZ6UE_y{Qun`0zkUDx&1^M0KW*Z7BkkYA&z^IfzuP$nX+8hZ_;mfMK#p%WBj`KJ!U?W@ptTr%)qZ> zZD~8KUzhI^zeaLD(WUn5&kf_(vF`N>G5mNgW&o#evDu5 z+$?^Lzk3onhqF($>+5(kRZqU^*!1zW%ECr{W!cUn%DMLIMd!k3^>ytH;@8M1dHAo< ze*Mf3hs{$=dSCuL(?7$nu|rh9j>oc#KWTbbQ#SkRv~%Lu;I!K5H`?pS@MHYCcuD*k ze|POEM``)ByRS|>PZ-v(yCv~!q~Phu#h%@-%g6jS za9V!td+)N2!|`MMdh6H3ukm;LDSGr$pZRUKt<=|toTMg6%xo|_lL+V9ukUxR>tA2D zUMhav{7*(!L{8l;($1p!rw>J$-xliEF-&1Y$@Cn*?%78@1A5%F^RxZ!0+^)ZTS?P{ z<3Qm-h4(NSfZobCcu8X^)SUzaby| zg455hwvL})_=Ml?+k{_uckL-h$Eq8Zdc*!U`gzjyZcZ8Tn-l*n8=MxuH;H{NAI5*- z6Ml(T;N7*S9Nn?9dA_z>U6(!D?O(&slcslb5Ps9%x3c>+`S4$G!mnB1r~A6q$E|2{I|4Ti=uqe!&U9u3h})bJMgd;5Vp! zLHeZYYm=r2hvL_npOUu!mcKS1{DKpHgVyK5C;VbRc;_6MbR02hdT^+5$V}FUbaKKk zIQx%R$ozsGwFH26|MtN4l(wpW{=?Pv16SuO8DH~_Z>#T23~<#x>DtHdf2)+wLi;z9-d8WXj1Fj5VGq0B4$3y^cw*A@F0O3GBbzxHw*V(`nYPO( zA9>^kdpr_9#;>RD6~D&cU3nZY$gMHGYg=*WNCEjlc6e zAk*^e*%AA7^SJmmlKY7+b$xw*s9(=US2&g{@oVgmKflgqpVRU;=A?hr;Pm@-VbA;_ z{20G3zC!#Of43jL*(rOz?}@dQ%~kud(DM`3jcN9hiqmI$aO!~Bo8ybUuHR3*`#CrA zw=*w(JoE2GZvT+T?y^V#?!5m~edi5rU66Iq$in3hD8JU9!Ev};Gr9lc*VqTYF2BNW z7yAyJ_qNQ(Z&<|P*v6pGvw9y}c|`T~)*Iumuh;t~fwOFv^d5Y_2G5@5}A4BcI>0 zK7C@XdU1WB(in24sGUVN%n%o_q{7{Bldztm&!Zd+COJrujSI9FMpPREC{;kTWW zc?aP1^XqR!_=Qh+=NxJHy`J-7rSjif)H3Mh_4>xeVbl7r&xYS-PR6Cd>F3uU zS8INWH{sWgJN-5-6y&{H^RfLm&G;&deJR^HX*Yp0EWUzI_=Qh+=NxJHjqShbl+7AV zHse#RoXq)wHv_Z<2O4>3L3&nYFWD zG&?&?A#?DFgWK7ydnE4MyiPZK&MuCq9o9_veh6@e)dTPezuT+AFTD5XcmKAtOCxHBwKkLWqkwZzJ>bM~hEMn{ z-75UTdw+iSZ#%o0lksYBhVcuZ@Jl_0ANS{XAGfn}(hh4IoMHUJC;Y-EymOA+@9pgN zi0WVLIjq$2vhD{3XBfZ4oA7JLop%0{)6SN5SlaJ5@8pDEaE8TK@Cm>03GbXE_kBA% zC;cd`h~v++gJ~BxXQf?Cdl_DlX|;<_)hg$zYKC`XW!Rk|1&KTU+<*Uy+F^+kYp)Sm z{9cjWzZS{;Og-V#eaD~q-IaeAY5Y0qeYyE%bHw;F_Q9`rZ}Z#5&fV0@_SccmwO#7V z=ObSqd|@{I-|Z2NKL_8};9q+6vcc)Em-miuz$g6T2k>s^Cj7?k9xa@#pRaACLU2a> zj;LL1+coNWk6(i`j9>VKU-E%>&XGy`wGJ_2n5@lO3-yxUgJ zRZp!f+*93%Ul(Z2-JHZ-;B@0I@475^{s{FI{Mz*vydq896}w|Ane{=T=LcmIR~K_q zK7-Tc*R_pzUjz7rU#^08&XI=S*d1GwK7LiqNn8z1fBEbmf7ato#L>jnQ$HthHSspQ zBGZbi9Y0p3v?{Kbt83FoFD^8y(}$*yUw>@+LX_IwjjO-VcV1`dUnEW}{ej5luE^Sd z_Q#LS+TZkztIHeGZ(LkA{l_;Qyjg6pKjw8}AN;!fS-)N28<{k&K3Z9?P9L5gW=N5& zeKMI!Ev6DLI4!=hy*MB=Bil3Va`2}YfzwimakOJ?VBaQ#Y4zNu9JF))T z98teVv6;+&!5PLc{Q>Z6_Y1%)lKB8}BP@S^2U>@hy8WBQy!+0G;^*P-SW-~`f-@|> zf=~D*UwG#n3BPe8EI+?VmPlo@9=(+le!)4&fAze3`sbK;-|MF{gwn5xq~8Pn)sT+! z(a)9EM|$*`pL_YB2T2^qbLQ2j`&H>jrC+skR{B**kA7sP{i@fc*RNXskhD{Z9}&6x z4%06ECz0GwP`_%;^r!Ank30RUJE8BrL+_+Y{T%7IANx@5)OP%KvGMQse$~#1;)Z6z zei?9v)+>fj_?`K*@C)z#`Hda+OS^r7`&COL;!vOyi~GSD#xH#K_e~y08UO$~7lzvSl{T}e|?FZHRNRK|A z3-Un^vT5Qto-?mL-LFbND*dYHBR%KHwE9&ePfR6aOSCR*7npFKe7!+7^P!p}YS*-85n%^Upg?msKTV}&=aYW^F+}nmuNQqYb4K5r`|Be;`ew|2ndGzmR?*XX zo56Wn^h~|Izdq8VZ`-^Ffqc+6_mc+S&xoG(kM-9_di1qcrM*f%r7M5o^q1_uPV_aW z{@gk5p6aiU^yuR~9ON_e_oA=;1ER0}YSB~tss8#%k3Qb}KtAANf8XL!(ZfE$Hov4t zAN!Y*kFBqBpXlR#54JwiqmTVE$%p%7pQYCAqK|z`ZGEIiAN>d9W9!>FCi>VX)7D3N z^wC}=ALdiiFUb5(`ipFRq(>j^Bl5BJF~5^`s;!Uo=p!B{ANnQ1M?Wd;B3mEn(bqBS zmB`1|M?WcXxUG-$=wtmc`G9NgZ{@kB9;xmAnd2w6KGLI)^{(W@`=GER?*(K2t*wvr z=wp2)`2^`>ovW>n^yp(fANd67V_l`KkM!tc{TTV+x7;uLdb5tt)<=5uv0jOMg77il z*w#mS^szpMe1i0`PRZ6sdi1d#gM5PYu`b5eM|$)zPm_G8H?UvloGA~?z74iM(xZ=g zf#d@|{DkL^aSB@>>CwkLH1Y}3$9zCrAL-G@yeIMr(#QNWTOaAs$2=SI;rZi!dH$I1 zWa}e6`k2>2K0){xm$CJc9(~LsAfF(8%;&K6ksf`FTa!eF#{``6|9B+f2=QqIw9OX6(%`>5xq&&;M0Y9A<={f_Rk*X_ zdH%;Djz>kk<8-gnady#z^RnVl{oC{LzQjmko;I zC;-ikw>WtA{<`;@haWn5BY%3&F8^Qedi8yw@bE(q-Jqq;Lw{A2z<5r<1rBg^mIW7h^>e>qc0Y^ViSEg_ zc**F0lSqD=G6&$|I&f{9bX>3Pb(oV3q}K2KfD0VpD&H&j0bZT%h&N%%$3f2*IKVY? zL2!Xr<2sr$7Oy(^<2&pH4sf-X1Q&QUF0&CdNmG?U_5ugEx+{VUyc*Zx`ATE8R!J2P z%AUZ1k=P3y;F{VLT;SEXj*I~pIKb63{tI4>>*yG8fdgEa6}%ePu?%rtONK_mBjqT# zYKy`n<*m0|)iGVtPmSmIKFJ4t_$9cw4qRKS{_C~94wE%*FYszy<0x0b0j{|>2rlqyT;nKL!2zz8u@`tXu5pyB-~d;9OY8++=lRO8 zoCqrK!2zxr)osf21zvD9^uGSEG3$DJy%2aETM zAY9-8*VcK#1zvE`hV<%8<2VQxIKb8U3G;jzyXp9A?cD0TDl7DBHWGW}TvhZ>y;CIj z_H1*|d%nzd;3|H<|9b4TrXKt1+LC&k1Ddjt-~tD@whb=sOXFH-)K}-%DjW5c^sxl- z2o7*{jQzl?)19Bcbar!bF_WIAAY9-8SFt8Mf>&^@tGD!ILtqdtaDZ#u-~zAUT2Qmz z<`>hL)fo09@O*&-T&23$3%nj&XVaLCXX6U87dU#j-eGt&b`xBSE7|tOxoELh$>0E2 z_dg0Q@Cq&`nn>j>K`sJ03bGeCz_tCW2A9DrxHhWI`SaCfTWJR8*b5xs>by;Gf!Bv? zzM)>`P|2oa+T0_!zyYq>Pnze;*iCRb<;48@(#pz4EnOo8@dyrZ6@O81fmd+p5`Q(5 z=gYoJ>;(>Rl^+mX;1yg;=hhcDr1dd>uD(%AujseOyTAnwaLt+L3%p)jYv<3VjLNo_ zYTKJ}D{z3T^UGo{@Op9S7%Z!}6@=gd2e``rNpOMJi%XRj8w)GxHb4S-G&sOj+BVO< zv73!+ezD$2bC@Uy7dXJR^CN~wgV)B@*h~`@?70#i!2z!Jj|(pF?!mQ^ZEFo&-~iXQ zDZjvL<2qN}sMH(o{iS^bE^zd4{jk^zyf&`Y>e~8hieR*U@27{$-~dRSjXT32e@X;^R;d8`f%yDo2Fc{2H6W7;My_e1bDr;R_m)(9Z^`fnCdC^ z0tdKgZ-Up0%Nf0zSEc@HWi2ak-~tD@xOwn;aa~$pTUf7V=!`0JaMA7u*UWFob5H+( z#uYb$9wqtdPQdq3a;2e{^bPH=(O!KL~!N7eEG7dXJR^+SRSyt>~+ z)z`D$drETLHSuu!XC)tW(O(WOt^-%g>Sxi{D_kUxEo-0q!h7{RtFRBazyYqAcgcN# zSM#V_LyIeGYC24q*5QB0PNW1EIKZ`I+GpU^xEAV}!2(WCf(snr+BNYFc=hvjs+TJH z!S0U=A9E(YL!-_|f563c;OZEEl&i##7aEnNl#2({2bL4y0N0H16Yy#tm+EV4@n^>N zAVfOAUf=*%`8{H1@M;%oth^zT&NMCp7dXIGx?gaCSL3RwF_<*+?60GH*!w-WzyU6v zNANm4R@U$FrcLwsT1y$YzyU5U1Fy!lUaK!=P;`-%PlAhb0bJd83y+i^+JEo#rA&6R zYx)^lKO^~|ZBIF2t^-%wl=ob(?KO^a0vzC~{k+@<_vJiaV<;!U0j}1M2`=!CtDFD_ zxN7G40`IuW32=am=MlW)Dks1JE}nPrj;oxYTmTnwB;|+3l}%(X7SQ^=AIdLqfQxIu ztJCSYFq28hN_P-0;(2h*nQ>9#eqG)vTxm@8b#8gel&4e1@0~Bzf5ffWi|fEuHgTKx z`ZVHu^o2=qfdgF4mXu%Mg~w6H_uv56u8F_Et8tAZz6S@mwthkE1z!Dpr5WGX%(&Q; z>Cb{!yWZxy9F5xfqMV~Fp;0WQ#kSK}H-d{4OmuIAh2`J(*L{+niezx7k1 zzhuT$u!CJra9t1AFHJ@{(KI-~)utcQ+}F6u32=a`X!`BJJFap996ek=Ej)sET;)X3 z-~boTBY4MEPJjbk_y>5$RZdVYfQvYi@r&0Tt{?qlNUW4MjUfYH>z|^1M1oyV_6YfW+*<7#ApKq+3t*E(c zX-~)!Ob#&TKX8EqT&0Jk909Mkrvjr!+0@vin|$b_Qpi4UdL5ho)3~0dr1yFoyS6R( z!3+M*9|?Z$>spmq<6m7_ud9ijv8Qa6Lf-#jKM&sPHU5vN1--lK58U7cckwp`H}|9M zey+M$*=%g6*<5N)eM|;gA-HY3d#~5H|EB$>8y|Yh)Q#1T998SqUAu!9{GHzu{M?tu zUs*a^uP!IU-}$=1`}5lPz1N%PMz57Oe=dITg1`6&f}i`+Y1K2|sIRMsWNKD@H3%ZtPl=M|=Y zAM6SaaBZ7%0K6KPt`}U}s>u$OSf=debF}U81D&BN>YWev6Y zWd)5Z`RG2{!X>!C0WR(Xyc$I&oxm1n3Scnvfq@T(O~Y31*R_$^=0?xWgnZ;PmA2T zEc<^>eZTwO3Jo{#W`Y!3-*+GWE7>>nw?tY$r*^9OzM=qgU%cn0^X9?(^*nlJ_g$a4 zPt`+uWz3qkvur1ItJ?KstzL;dDU9omHuq7olb48Emjs{c(*Z8()3tb@8hiZ z*{|hvALre-x#b1-6h*=tJi!~!H+g%fw<#0=?fysBn$fW7X>pMgcVAH#P=8XN z?%pT$DfO(KKCSo0ov3b1pFT4^J00@{a_)QM9_w457T+iJL-}t-cK^sPxv%2(r~2;G z*{(~uhvfP~VQ_sa_vKzaX-D`s_QAiWt_-eE&3i9m-_D(C&DG{wb^1i&Rhm*Rr~TfV z?zatY_r|{QloD#*bpHxC!`^!VpYXf&&%!Uf+pvV+>+P>2pL_V7KAC8>Yc~9rz9k?0 zf-{U?_=MlqUkbnQZWAZ`#^0*rmZi%1>h$qSl0A_%CcWRX6A!0cKkqy{AN%lv^RmBw z)@?JVeP-{s46pD!_rHZ_`0vki{P)M*rq_)$>X)kLrcc_shdIxR=h9c_gJ*DBJoij! z^9-*&p8uQh4FA1^=0N;8{(Iy+JkQy>hdIxR=i2k~!817hJhSKY-uF?>8D8Oe`~MK0 z;or8siMwLYk3E{w9K)=5?&hT224_^B;T4{@e&6tH_z&PYb^zw_=UbCZ`^$>w?dRsh zpTQZGXLyC@_7{X__z&PYb|7|ZN^5Ge;<@vJeDDlTKhG{(cKr;m@I3cd!ZZB4DdotN z+pz<&Qz@;1%Zlfz>3r}E&Zs=YD?HPG1pfg%#}33!C7c%ro~(E-=A_&Pr=REGI1FCl z89Ty1=ScDA>te@Yp89#N(pa3nz21zqBSls`&pam|{tQlw=U1q?aO!VwyiLEa%`?2( z(!8(ey10Q@vbRRLXb$lH*OdE7iqFai&*1d)?AnJT-7l)&?@B+t{XR3UW1Is?{|V2> zHReLC?~3Z1VH~74F7k^qE<$?rB2yk0Ih577Nc&GDZkf4O=4*5w@0Z+9(74Fd>&-k8 zBMXK5)%*he*&pK~*oX3B`{QCSxyQZ#n>cUp4-vod^qWUa5p-EL{pQ7Q%}2jEIK%qQ z;S+w_e<%FHyKPibOlRhpo zmy`M)oI&-y-5!Tmc&>fI__6Wl{yfKSju$-f`(%!bPB zyE*RVc_PO}+FzBA_#K>4d4^Ybp8CA-4FCOkJ`}q>KI!8kwVaHLfHNx3@CwhhFPZw; z_;mo!u>&wqxjm8NBAuM{uYofv&+rP*#e%dm;Xi=q*n!xjkBiiDGH(H#QF(?}c-}c6 zJi~tg&#?osNgo&4$;rG0a7N`BUg4SkBlr*CId&j6>Ej~JoV2UJ8I@;vg=ct$f6kHn zeq1Cc^ZsWH&Zs=o?`!i6ueRLp<05l8iNnAd#524xE<%5O(6|WW97y`lcs}-wicq`!&^uAs4FCPU@kTVIC|T zC_MIX)1r(O`Q zVgXN@o=mSPnEB?XWxcgt0eos@;hyS7oTm`2g+e)Gp9J^H@f>O1^m-9+zS*5`zGwdx z%`eY8{DwXEQXj-8IB9yUdJW^`Df8RP$$B7gdicdOO3FGv%`beyFBic(=SahkQ)cts zFfwU+H?L!=#J;AG_Ij^&PWT1qpmDD&ieKts>gDo}n|j&Q*RDO~=%bha(b^Y5?Ql@D zuL?i6>*Zk|7+o)~JK21x?>f%8cS-$Q-WJ)eN&f;e9HD*1{rjq3#yC9D`zT= z%>>Kq3rW+vY{+I420 zsOcB6bDw?2p17;tyyL_X`?|1mJMJ1*g^s(_oc$G2?hh%BX#b4P z+vD#yru)0V>FE#Y+usGB@QeN6opYqaPu!qODM^|h99i{e77yhk?gD2RztmSYzu3{1 z4nOvnL!2i~Pga^=-QQJ9*?(Ij@?Y*_SV`OkP7l96Rm5GyS;Sr48zt@{9`hwqCuxmC z-MoCEzP7Tgx4Dzf?;%H`!p5O??vOYFIdw?RTQh^>3;TZEb3G2Vf8s9e64kGhjw2;a z4-Z+D+ohb8+u-#0b>DiK=N*2-p8KTZNJ-PX{K_~*+U0gBCvi16J^W%CCEd6hKH-;( z;GJ`1(s87u>A|6Pw9lkJq@0s_8Jx76u#0zHj_wbk9;RMyy;ACB>TA*=(;A1`TQ3hc z5*0cQ^*X74%P$r=^-RCyeu8A#td~Wqb+h}bUY;}d!LN&r!SPDce#)fjU7oTThiZt&N&i( z<93Op=fByELp5^}cY!mEU+OEHU--0TQht)AckyHsceQfDFF5z`YYe3OL-hV9#1%pF ze2L4Dl-oQPYAC?@(7!_5MjW?uPU1Myo6CD5t#PfraolhtTVdl`JI|H4qwEpO zcSDg6bR0MLq5U$hg?%U|x=$M%$0Z$?N}ArKDWh?%oQzj@4Nl65z;P|ZXOCaw2k`FN zQ;wW|?R`A1RT@zoxATL^;&gC&`d9k)pHZ&CFMJ01anf;}^CeOzkDj&P zZ>M&gayBKhuN-{NK2@^?^_G^wm-hWt$6arCe(67-XzHZI5y;)ca=!Z-e|%B<+!x-f z=cROh>Z5(%%j0HF+_gIJ{dVqsxhW^NmwMQT;mUK9fn)W5WZ556gU$l=rD@ zj%Yn*^Ud+=<)ShII4>&>)xUs`JO06Q56|}VZ!1Vz{w7Ti9yPD%nk?oelt&bQaUa7< z%5QKED!;WK!zcWbAG~vp9B!0?RIW^#-qj@hroA4cnUnD?aMFHq?V^vwf2SVj)=Tdi z=p_zs+5@jHCNFZP3X&XGyu@1*I$q2{MK z?X$Gw_jXSD*T5MTzf&(=jo+R4-o&&zR=OJRo3@&^h5ld@C9m2?>@i9^=)CwV6o}om zblB~t!R|WAq@jCJQRzu=<;(BiyeLVYgdp+-P^A*r{w5B#jt4zPLdU5)wT3b?G zn#3%ik@2jpTl!OYPU68^*6= z-B)xx@vg+LvBOor7CW|cvcC#AJ$~(Z5Trl;it2#FkMZlR9}>UD-#v+(!`Y|W^>w_N zswZD{Z2I_GWnrVfvTWxO`Xup2uhr{M6CcQ6zp6Q?A z*VrSfU&mwF#h*02t0|j(b-FpJufb`x({Hrbk>SVq_0$dG*Z8|@PdQ4JI?&UO9k>+J>cD9Ze{P`{303L8qM=lC`D!LQr5_O}aQl8$dBO%IL(g$EV$2MV>6=eJGe zPDsBu)mFdo;1CiQ#SlIbF%&moEE<~iG3~~#(&`xeu-D$-LT7s+?I}mc>gyXT zYjJzA)U1Pq>0Lb8_-{8S{DKpHUAy?p=dx*6;J-ob3(_ZDUz;>NIMjv{&is_r{WmA; z2bu;a{06SiHSI+ZxFvm+V>THuKfD)+d}<% zQrGEmfA}?axa!wpnPN`HF~I5dYrRguuCMXqo?m~z_%;5{^MFjtuV+W>*E7>54mXnf zi7s`0eSfH5&qh}`mMigV?2$je&Ssy}Vov(M!Rhzw!k+m(T}BYy91Q_-3c< z`MxLCRyJ4d%RA|T31=*Y9i@mPjPrUm%H}cncq4@FE4I-O&iY!+} z0&wU3|37>00w>v7*7?_D64D5ASuvC#*dj=a2t5-n6=9RiB{LP71juBD;_vRZH9a*` zz3JO__ryvBGv3zr%HLIEu_^`vyX`fiE?X|E8v(VA$%1$*{}3G{K*Qfvy!^EUB>(q4 z&-<-&&fDkIIdv{ob^0@v^gQQOo%eZv=lPxIeV_MwJ{>r3Xv^#`-!rmw@x98g^=EJ# zF4s)%zxXxw!LPfo_S?n21LwUhbIBVPNjSDK=<~eZ$JQEAeck!aD8``Ex4+%N8q zTf!&&cAhEx!n(klza6bIjM&!S?UE`j^FF5`D`rA|5f8i5;$p_v!M;d;w<$PGF{P$+H z40?HeVdJi0)B3N^hu?NV_ywn*Uw>S!`6b?jUpwyf+q6`Y_iD{0_TMbyt339l>=cAw za7M*f@Cm>03GbXE4Zn%~H=D9qqsgaTTr0@FHsBoOzxw?jwEuYjN536t2&LVOB(8>k z_Kno_g4RcR^cgk%e9(g=e&;#!>bs=M7uxBx+gm?m+U=%2kA7rs?e>?<&JI&(?SJCn zcKgg}iDNqlMOMC9IjCOIaUp#6`F(-#3-7`F?%j5K zZ$$jsc8z;ZyAGU@{2D&tw_lGLKeqGT>+SY(LFPArGm2mMgkSiq7~VNY?)7$iuORcu z!5PIb@h1G*aVNYYC#T&m^A59qUwXM9?|TAgRD1=W@C%Rd&N*^&+U@zwE3FlTUvLic zU)?UI9Zb8p`U+_m(_V&GWLE9slg;|shMF`s^-zDQx$WrNJvBtC0-WRy?k~%)qaW(eAubVIP+r`e`)XVnQvCp+# z7M9P)zCQfIeEQQ{1@UWe`u%$McnN&MFMa^;wta=)#NDl>6AR~?8<`NC55Mh#@C(i; ze&G{-;S=6DM+(2m`?U@&omo)(0;edk1&Q7-*4fYI)Z#nzd-iT!Iomk7GJi*7BY9n* zHFpZaFF1+29__sOhKIj<>W0QcN3PfNNGYHD^_42C)&C{C-V$rN|C+cfamQ9V>$^Dg ze4{+Z!@33G7o70xT1Fqa{KBX0zwqu)*B|dp+_9D2cvwDhb-7ZEb=KhYm(Tw3Y-jw+ z#Ea{93gB5Qvjvhzp&c(m1gG%!xD{gA}zn{P4m$Zp(!lh|Ny z%sa(CloMN3zg^%PnKn*8QeSUOADSL!h?1;*GOu~3?U#+FoM`@Fx_ODG%a_6ub7_Is6`-Tz=al;&(g6d$aYtVsJ+B3!m`Y{!-x= z-h=r~9HtAuhh%DTI+l+*?d+`gn{2&&H2&NAft3Dha1M&obw4P4!f*Ad!Y{lB^P7C$ zxT$}g=GY|i+Z$0kY|6y#wtb_{`|}G7&M1E2v(K+-XTZCipNXI2G;Qpp&bg_7CzjvJ zi1=;&$8`P+&PaX@pYRJQ@Xk5X@S8ZmGWGAo^4l3v`>2~Teg zB#p5A{T*l>Ugp&gS{YIMX!tvp6qL{4jEb+|6Mo4T-Z@9YZ_)_M&u^L~T=}dE=#Hp- z#-77U_yy-6|JD7V^v}@`+V7_`8Pl(cq~8Pnz5SqCAL-Ete)2&Nk~og%%&YH`ivQ?G zrC+u3dRUB7DYCnS!oJ}k2NCn9SsPIq_H&!}n>+og+mY|( zL+_+Y#@Db9vrx*7Z-vvs$PLl`0c)5_=WdieiMiN(r%yN ze%11Iqv5yx!|C`1XB5Bi3BQ#)g^ZE2UvLicU)>K%{~Z0G{eC)=G5wlI`aR&^+YhSsksf{ECm-}6iQjq7y!v#%D*dSR ztD=weoFlX9SB*U}m5eRv&R6|>;C$7YACx$D=NFCK_Dj@l{>)>6^HurXmDlX4`Ks85 za%buf#Xj!+`j1lgtC|VPw;ez1S3KldUh`EeBkGr_(oa9+eN*m$Gpb&JPx$S;P56a( zJA2_baoAsC!g>1j3pve)8d2O|Njcu$GB^j-E4tkdpYYqhOZbKNV185dt2+LBaC%bx zw=<&ojLnq$>3}oJf8i5;XC4)P;XRn&q*1@>cQgD>s{htTG~V9)-gNyk;EeKL_=Ml7 zj_?cb!TctT`r-HXyH-=~a;)CZTGH!6v!1WoD@fcA&M1E26Ml(9;XRn&6!TRtEG|wT zTU%M)ur&{Ro)5pZ5tYxw-YwS?UxCxl@9uT`@Cm=@fp^Z4CVoyFU>(u?9dkFH?&--+afk7j1sS%uc^d(g;h^hiQ-h{eISU-(;`bcXm8Uwuwvp?8kPc_Fre- znVAno|45hhrUu#0+hpEY_db#Bw|AZPfAxNm-u@A-kM!s(oBc93O+M(W{fOwRyiN4< zzFz8cTOaAsw{7NMlTY)Y=;_^H@Xd&x>bC^zBR%?BX1xvhps)QJ(KmHK^z@zDP9`bdvH-V;JTJNJm5+RH?CpCEc#*9Ge%J^FYr1^IxB z{f2iAi5~Vbw)r4E`q&SZe0J&kH%6a%ABC-t^yp*%P4eMB*|%xy8$=)bpxXLKk3RYj z$j8>#e68qX-%VQ|>Cs1fm3){_NxvZTJLxyD^^qQZw2#Qg*2nx#+Nria()ab5c$|Fb zmjoaEq_m56=`-okxAT1x-;CCY<;9hAM*mq2Y&Gro!s_H?guAO~A?-zGa5gGJc zz%TNaL+j0z#`>Jvq-brSzBuGtH_#HC*M0?{^6u|;@VHloA3gH$i5vLSdw}`>`svj7 zrP3o0KdknFQ~8>kY%NQ?r@tHG6Ypnb9XlK=^EK@ zK?fH&z}0(DaDi9jQpTEFU2Cj2QupavAk=9XE^vTr^S1;Sc)@jH^=y5kF?VjUp2c3V zyYcZ2_5ugEW`0+2fmc8G^Je$6#FLZBRLQn^KAMIXews1|;Nm)Pb^e>+;(BebL!9Iw z!GmgWfdgFC_ZS{M&;4N%;(>R)gBRC;MKUy z#?s#8nH^tgX#y8Gz}5RD!3AFD`I@UQt~TqIhHOr+w$y+N9N^k9_5!cQb$AT8zyU7& z7rYwRkul%`2e>dRcr~u0IpVsC42^_G%29AN|GPY2l(*h;RmXH`Kb7~3{_Zb|L?7h^ zxVR2nQ@`WCUfb&siF1(PK{dF*0j|pb5M1EZxW-Ygf&*MV6MunM;~Gb~3J!2>8~(wo zagC!~1qZk`9}phFt8pF5(I3OgRd9f7>-Pm0c%A2K47k7nF8mj~&hs?}T;KqgqRsh$ z*Ll8j#1&SqQjUUa=L5nc<*ml00(%wTFDx0znF_7n`=R^-2e?|lEx5o7u0{QxfOW5i zY>vZlfdgDsQ$K(gT#e;BvjGyJ1$%)5T-|N47kI&SX0frHQ`6Rm6kOl{*Uozd7kI&S zN8>JE`m9dEcmxNyTK`*cfwzxqb}s2uiGjBeh6^0v+BW?{-~|_L$bp$8_%RF@IKb8Z zjCsC{-E{o5c6N16l@YQG}(01=qZq^)`1di&>3PsCmA?0j{bk z?`I5N53Vy=%*L~Eh1m-n;M(lS^95ePb#5i!-Z&R6_5ugEI_9|tui$c`iA>%)%%p-s9xq!&!=PB+#|Ta0j|x5 z#9rVPTuwPLx4yKpveC@eNMSsJ16*a=L&k1`OPBboxjbL?U1BeAfU9Zx<-jYrmd>u9 z+mP1B+}VYVW_Crt8e;Q(zy%I)?U?!zyk1;u=g(w}$_L3g0T(#H)%sO=zQF6nrDL$X z;#LrX3mo8@`Zd7?UN0_HT5Qa(WZM7<;}IO-n)yw^1zsE1+_{CtEQg80aDf9{ZDTL+ z+PD@kWQhv)TnUfh09VJ@3%t8oKU0~a{JRsAdB5xh38vyF}V!lHYBSs#H59N^md z3&90m8`o-MZGAOEFj~L&11@lYYx`4z3%p)j^LowNMg~ioyg;mDaDf9{Q>L8;ULP*~ zw$zME)-Zd416#kIPy+Rzb&b&HvvVlQxji}ogXy||pwt2tHbuh!S{0tYT| zfQy?4uNT+d>udAtjU1g(W!}eSo+og%KW2C|{S+G4`h0z{F;~B^v9h|hlBF{$-CDo* z)5m3SfUEa^1Q-1j4ldOXFshaZxWECftv@oj3|`%DqU!5e?>(hC?);_bZ$2gxUG(FF zi|fF(`G>o&SGY)?y95_Fz%^y;1YXUfZVjDVSyR(tvWJD8&J9AJ>Qd&zEDb#rjgl#e;wd z_!nGFg9BVM|F7Tzug0~su(pw z2wsh=sm5Tk%{^QjxWEA}o=5OHJl5Cm2-lSEm#eJg-~tD@xD31+*Lri|TnOxh`a5~b51_!vR zCXNR0xXKA|fU9ic9Po~-oB#*7cpkw!u5tn#;KJL$JFaqqasgb#k(3`AS3Z%wSU~Id ze){E?_1tp}cy&4*7v?evS?LbLMLdtaYJV%`9dW-d?-Z^qrusU!T>BHzzx6l%a+SCh zdvP7OHb1fZ`mx0K1_!vd|6Fi^7am6)--82OJBCN>rg4oUz6S@mD#l*m)z4R!@%`ps z3m-e?IddL5^^aX|b6p?TXZ_EYW3Ms9_Z5Q!TxH`Y;MKUs5#NKOkL#0SFYu15-Yy#) z;HsE*EqKROZ-WC|JdfaYcpO7~4-RnQAK=xv#u49BE`Y1`r^b&>Ii~$L%lN+g|Cs03 z^m}6myPV)UaFrjOjB)}T;Mz9j26)F+PJjbkn;#W>fp=Wx1USI8Wy%fkj;ovi2e>Nc zc?9pc$_a3Q3;zJ`xXKC21#l5ZQhsP$*i)}#(|;P*)0FgHZ)4ZC1wVMf zzr*uj?0c0;tnsg|tS_jEor$Mx)gtzJwx0*@^&0;}YT@jT`U5vO!QJ|_*q!^)c0b!V zSHG~hp=NWbIrRw{Xh*zP%C@`rdX4+Tx4!uLmmj+R)zhDR%d5P02QT>B=DFd%H2(V1 znT5u3I{f7byW9A^*PG`?ua!4{?sEfP@X!2%*q{5-Y1K2oxUjAsnz@`O3#hz!F2Dh< zj==@q-MHq~7nW92m31on&=0u40j}yFh`qq86}a}Azp%csl4yNOCt|-|T{h@HjY~`K z_1ZQkPu+Ix(2<+wj^1?a(5Vx*_w5Q^@OKSk zt3Iy(fD_#666eGH==RX5)Ai-7R!`0RnfO7~w7*Pt{e2R!C)a_iW72WG#x=Upeb-*# z02lWGUX3fCl|bCNUt%wCfQzfZt8v}Umm`oGS64l7?AP)pb*!JisL!pp%l@g;x2mNs z8*7aOF{!TN0zX&A0bo*A&d7dKf<}Y6JrS5dAnMDRpOAfQdcP&IWA;xh-|Oy+uHlB> zOqgQp`X3cz*1WjOG~T#q(4_cm`)&p5YaqYZrxQ_z&UvTKoIB z=N^B)CC#+Iym+oXyBPiq&bU0oD?GQ}B|O8w&7bk-#DUl?8Lhp`i|6fU7K3MS#^o7a z`#gU{c!vKFo)ZURCo@_Dmlw~Q1@UKa#^%}Z3eWT(!G8$Pi372dDd)w3Coi5m1$mDR zIOFo%=hbS5wG98*6)ENR!NhTxr+%*17tc+@< zq1Javl?jZ4FfP)0r;Lk`9=*tn$3+h0H7-*55s6#6KP0mJ8-B_CgpG@oe^ACnkfqYS zW;^=5F)o6AC@(fQ#6H-?mL{IJzm9$G={Jv^Ciud9`pw%B^TdO(jP6^;MZg)=Zw{aE zTYiV|3-2~^;Wue*pw^VR<6e_FE)p@H+qTE3&*8Uca7OV9pYS{Nox(4?+xUgw#Le;2 zq>qbK3NkJN&anF49v6XEc;5VNQ;!*c4(2&=bG+n<-zRchq*ajk9h`A_hF5s*{JQWA z|G_*bZjO6-p2%^LPC@!zz!{fkc!lTcyG^-m{5qKD1Bu(?lRhr8QxKlP8JA~xh3D4y z3(xQ$!gJyP%u{Yp-McM_4!@wDrXLyC@ z=6i)__z&SZaUeG7<0939#9`o!%X6Ps(_c>i5&VbnoH!7h^l_1PLCS4##^o7a@n?92 zf6kG6eOzR_AUuOJF3kFBjN9Z9fv$?MenHPwb8cQ&S-)I%@B z++W(K=E!SQ!Rtk~eof*QWaW2Fyn3%l?kB#iAC+qdkBh|DH=Zl?b9A4o^RY|Z^1`VX zgsVir)21iWE0}M7O4eKJ6~HG~=I>~1BzX$as@9zsq~9Ez-{H=4*tP$P=9lLkeyb7B zz0?QE2~L|HCaz$dJY#;l1z9fwP7lABMoC%cr}>3X_~jya=NxJHamsAI8%Cy0@8)$> zmDpF5GGFgika5k9!8vH$>yq|gQx8)w&wQiQ%hcDdJ>}>_7e8g~i=cKmXxdjrpWF5F zun&x`m)D(az8JWUv-TdTf1BSUvh|=}MkBPZxOY$0%h(6M?tItac;$3`@j{B_^`*4w zT{dK2gv|YVMD;TJskrwO?}+j2PT+X<#T!aDe&z3|zhlH*@Cm>80leF}I{eJd&L$lg z$&TNA=A%@u`_sVn+O{3Wbq>Gaw99RqU-*PyaKk(2NccU-7emVI_^qmvdtc`DaxY^4 zu_13a^UL8EoKgJt>nk_@9*8L|KWWpu;BL$%?kX1~t_J5WevN_jbD-lc;w<8>okJ3L z5s$g{l%v^a?25YwcrdF_7C{hEMp#58&OkryM!GNlAk)r6O&5@aX;!XMcr^`$Jk0`@oWa zS~<0ue7`ZhKMFWK{UL$5e(jU?-$T$=@X*XdP@46h_A3{A$z1(`O)XUV@q(f#k z4z;^p9&RKmY8t^>)Kxpj#tw5Q>IPt z@|4dwRC`3_b}eOl8JvE<-aQTlpM8FfAHch7PdRe<*~8;d<${b;fYZ;f;>a3jq+Ekv z_=I=Pk?@R;k9 zUm|t#*)#V0?bMD_&Zb26m4naOr)svO-qJGo(!gJJ-1Qdcm*DwCTUW__AluKD^PP_e z_Y=*$^+OT!Jc+wj2fp9Vy{|ynWB*d~exK?$#V&FEI_*A_Y13o4eWee`e3Oj#sqBqt z-R)M2{YZrYa{yTN0n(u4srTYi^yQIu`q~pJJvc9aFUGuVheFxG|9n64@QEAv^ZSN- zcGes!*H$0-*L)Qzh~J6ViQj7{P26kxPi;k6$L|M{#_#(E$M4M-%6%Yv&o%M;7lY&X z-pk{}@As;H(|GZFiY_SI-Ve(xZTy`!J-G6U-)FvhH2d1k{6O-4H66c$ zGj9COa}UouAv2_`Q0{#J#2;-p+RR>Gpcw;pQu#??_W^j8>n1P2;ZVBWi6)V~rnTO5Oi1 z{r188o7rm0Unlp4w11C2cjm7~&U;9EU(qxuF>K zJ~%ybov+-cU5+2)*R5ZW=O2H^p2!^hI?#fg-U*qqdM9$&tQ|$UW*-X_FuRS__ zY^^@Ov9Pji=Mm>z`}H~J!g%#{yCnC8jFX4|8tvEDd?0F`V%q!i=b8N(evKXC`gJmv zUHoa&yPERZSEo{tb~-q%cKQwWIx_qizpnJ;`N!W~d&*H(e(mn7lgtx__3PF@N_~yA z?<@LT`}IpB{W|S^MdL_!1%8bkF8j6Ev-Yox5r>1*@@uu{_C1fQzk7(o@nihD`j6t* z_`CfSefI8v`E9qZEUXVXNllWN*wBuW8(}QDQ=|RQ(zEU&e`E9i?AIQ{M$I*V1F^>dD`@DcKNI$?0#c0%5QM`%kSyK zrPAH147&R$ehi=RTmF0TV|aJ%DMx8L2hyf@@yPn1tjEX71!+%%)6cKAj-Oxngx~EK ziT}d8Yfm{k+SsTsEZX13KTn(9%_$##E3Ybs|AN!v_eQbL#Y6Zne8MmB3cS1al%v~L zE}U;JH`Zm3cKg@p^R(&R9E9Jj_pNLdqXwI!Kuw9BM-XC(g>cd~RJ|4F3fu{JM7Wm(Oj}u7KaL_66zFuCGm-9vq5aXMRf7 z{#&`R82o}0e#6%1!YBM>a^OAcKOc6+Q#&2Ue;G1`(W5{i{_K1U5JdGQU5|cZc&fy z-%NX7{p@l&pk0L>?0P#a+qC0}Y16y7@)?h86=d83oWy0?E}wYpvFq(|3;Y8v&*mXWBhvNBc@(6^|t+7W#!igO6lIiH?&_rQSNKXNc+B`&y`*x%<`3b=_;vX=rC!6| z?T2r6%AW6gd~M~zs(o4H`SHfaG-XdDdiD+c&Gf{NJAWf` z=PS&8eVIrAZom7}5%Y%3l^5Tu{91no$Ki6#HgUr5b@tb>&u?CzKEBqtYkj`HIOI%G zJBxhAr8@-~mj-7Pzwima)MM~&TUGcykhr;6t*=jK&Qad0HJ8|bvx~3td0%F)Anhh_M#Wd~3BT|O@0=qIzlr@fo3dG>$!C13R*>=; zoP+#Vk2}*2rd?e7GU@N4y$r9&+}g!2nVlV`P}u*(!R_MC3nWgQdcMf!-%9(q^9 z-84)UN>WEodb_w*konr+jN%tQ;TJOCopYq&H*s7&>Fwh7i0WVLIjp2z49+Ni`|+mf z_pswmJO4f3E-nbaJ%ckUzJgENf8jlZ-^Bhq>FwfnLFR3ObCCb)b}{W>+Ql=UllY4E zvdwQ+?c$To`q_q>k-fMw>`sn?$Q>^Z*>B=g(hk`AjL6L`Y45lGOeFU;b@gWg$BSpa zL*iRxsr0c}AevbTJ+ht+-eB^b}7v$4lT`5Sp z4Nkvb`{#G*xEem;7e9b^+s?vo;$pjWV&QyqBNKx2;kQ$eavPjc{K6;v!Y90Qjud{A z_iG(mI(d1x-{{`JwAyJ^jhIyh_j0qy7C{(~0|6!I9Uz&hm)LiK=<7xSzO^{xfh!)dTR^=lAWxFTC6Nrj64b zeh*JBzughl^E3Z<%JD0MGm>A!C;T?wCj7#CFu%#;bcf#~lgn>=MB^K+l>CA-ieLDI z-wYr$gx{Ut5q{x4nBU~{vQ7Q#G{+{9-`0rut-U=R zzu=7G7e3*ab_TqM@EfOTV<&aaP5nEu{B}mf@8*xC;}@J!{K6;vLJGWdjx_C~!~vG6 zem|eeW?JDU%-TY^X zXLr6Jvi!Fqxu39p)tUb&<$L*iO*!xMt8PcW_YS?2Dj8qHK9oDnU-#R^#=qD5Rl6hV zS1rFQUEBc9sCorH;kWeHHs4J{vy{<~M27Z}^?ye$~o|_Kob^n~q;_4vPDoepSOK{@c1=_=Wdie)n#_ zYHdXPcHfqcUvNh83!m^yI|Dxs;Wu%BHR=7ThA)zgyA>%ir&Y*5PGt{i-A4clbM&6#afTgEK0=f=~D* zUwG#n3BO4rEI+@K*RR?s2*2PQpx1}uWBYF-*)`4U-6JDMphGasrpqPTzShf=od49-FIif*^VC;V1R zGL8iA!ThG^S9SdN;Pj;WZ*N5YyOnaj8#tr<7e3*)w@>(m_h5dLM*XVa&G0*^{@WSR ze2QL5{{?51|H3Eyc0O#%XXD4g{3eb1;rI5tR#WaGtoJe0>q0Z1uR0=rZM()jr(IVz zIHUN5&py8<4uy9+UlU&?Ue9yn!s6oev9*=u4O{cD=lSqkDG0yd^z*xW-9GIK_{GZb z&NfI7_&r>ozXOGdWj_4Y3c@cq{rvjZh3fc<_M**inAz!y+@?Ce?;pe zJ^E@!U&rKwzL{?{dVg2+%)BpHAL;x0zDwE*Hc$wK9e4OTLvHb zps)2>(bs-R^i;}nZr?BI(Kqu0g0E)ssjV4YH;b(Ng6P}2Dp()s(Z_o@$fx{PN!NV6 z$ntN9zUB*q^^qQZy!U~8whS)z3vNGK^zhyl`+iA}KK4T;A6wtf#|0nnd$9G99)0Y; zNk0AiH1GTAJy-Ct|E;Z$^nHD%|A2gKeLG(ieC)fqOP@)PKH96~!+c8m1)1MTzk#if z^nHD%eMCQpt&jPgv{QHKGwIPsJWf9JOM;JnQrbnfKGLJFX7tmJv-QzWO8d*!M|$+J z{+N8gHS-g~EA>csOL(#Mksf`lcO@U*2ZbGZFBtQ0ZGEIiAL}d0CrlsfTy1@%M<46? z$R|{vSyyT6BR%?9KSn<6lfeD5&jRcCY<;9hAM2IKCk!9!#%z70M<45B$R|u6>y&JL zq(>j?F~}!OAM0XleWXVp^EAnadIS4apCiv9>u+p*q(>j~0?7w__zBM+;}o_&(xZ=g zXyg;7kNJSMKGLI)c~9gMrjPk&wm#CMk9jua!}G`e^87K+&DKYH^f9l4e8TWCE@SH> zJ^GkOKt5smn9pJBBR%>UwSlJn{KGNFqlUfnY_8XFcG-jT zqT*2fzw6_DkE!MvUg4Pp@XtBY@SM24eCqUpiRQU{O)+=|XB5x394eKniszZ-vk&O~ z;tnbzgPsfcMc#5~ec^25%!Re(^*Oas(U5Q5K#ShbZ1?9X1)%fP?{V<#{&n{^k34+h z2LALOVE(`U_3Hal>5+#YzFy0H<|ccOOFgT<8{*^Wx)LP=5^BG@sD9^uo}`Y0?E8cP zI+FafwNLChwzMD{z4WT-~P$F7Sfu z!s^-jMq}>WVm*t!Vl6P9Q*eO;Ty0}7@apG&-t2ysxD(xz@6=Ut-<`7mxt}uEfQ#$E zwOR6CukCfnqc`hAt>60r7dXIG`Dc0V!K>39_9o2uIPCcX2e`JrOzZ_-jq6CpSiI`s zkMFP-IKWkTlHdZb#$`5^CTXTJ)LsS$xN1)pT;SEX4$ajUSDW=r@u2K#4vfTJ-~d^@M-$YFy(eSHS_U9aFA?SK}H-xe5+&ZJT-uC4-h%^N z_%C>!=W7hOzyU5roAUv$^L*uqE390l90gbVnc|O>w;GoU>{Wcfuw)=-Dztv@hw=*? z;Ob2YF7SeDQNJf(-K!y+<1k#{0N3UdjlGQBz|~m3GaDcgTCf*5z%}y(!3AD$omp%w zpN-I&#n0dZ2e>*07kI&SN8_$6vfZU4j7M;QYsU1yfVYopb}s2uiCtK{UxeWT2e`IP zTn%1u(T4Qu%;Go<7dXIGHuWQTb^NtgIU9zyYqZ>7QsBydGRJ zm)Hv&;A)!wFYpSkrL*hjHl+12cXnZ;nO)Iuk9UC!9N^k9Jc8GYYwi4*j8WOvlJ}xq zR9}MwT&-*5`2w#OmyW^mid#X5y}$vks(HS^>&2x?i;ek}Y#Sh9Jc0vUQ>GmRUK`ik zxrN0nhl#>)fdgE%{lX)7ZCr~NvP1=Yu7pQ$fNRE#+kkf$u9bXSYv2M0xTehbBY16G zXB!*!g+=%NvOWSAIKb60{j%V-ajiDi)>ktGqxE|~-~tD@nx=jPuNT+6UbD85!ICB~ z5bGFR-~dMrnsLb*W-oAnYxAF^egv-<*XqJ*Lq`=2WS_T3^cx9Js&%E^Z#YUR-ytug$MFa&$(OIk;%|gR5-jUC=+EajnnS7aMc+ z3mYq|Yb#kgqtdPQdp~_#1_!vdO}hiU4ldP?IjWWixWECf-pft9!{F8ZCaS)k_1;sO z;~i7awZBgCK^Ohy;Nm)PRj=NCy~0KE#Ip9IU-%_G&noHzE^vUWYjA;A^Qc=x=T_F# zbeJfu!~c$*NC_@*fU9Zxqrt0j%`fBz3pjlVE^vUW^0mSvc=hvjvY#sb!PG&~U#a+? z7oCs(fQ#$Ewewv6^^Uz3>q{9I4+28{tMz+7-~tD@Hork|fmf$nT3B04J~P&vYxFU= zzyYrA*9$K2Y8P5u`POKK8C?M`aDZ#(MS=^w8dp<|!DN(efSTSR@0Z{L2e^11!Rzo? zU%$hfHp}CyEM?#V2e`Nlyc*YfbKzVLMHgB5WFMC)7r-@ht?)?sq5b!EU&?eR)t8C> z_OwW}+2sV+fotc5{_C~9=EqS^7#!f*eyQLBuk(D3p_~8*xZ0*X#%|*(C%^%&=8MH% z;2l>v0S<8SJc4&zuE!W9r}5H~Py-;#Ta%b>P~3_U`Mmi0>Ux zG5!G;IKVY!+9}|L$5F@k-~iXQSw{d~jcXk7JvhKsHE|($_4AcweBYXp=cH-csZeXz z+gt~(tylV=FUMXv*4yAh@_c~YBI>y!qGL zFenlp!2vFwNANm4jv>AW2e?2FUX5!U@jc}NxSC%h&pqXb_TMby`^{H~{_;9IRTD7E)z$CcU`SKoOaJNeORqukUaxJ#8sL8UW^jVLV)`$*AD!mHdSmYV;>wx2n!A?uge<}2 z0CWBU7dXJRbDh*5*j3w8fl;GuYHZR?KJ-yJ;=Px89h?5sxSpn@_j(( z56*q*wcHy2>dN|pn%J3m%2v5Lc%NtcdGKDZ@js*%^zNuXaDx-vwOO${_oMB8wsEe0 zVR1vv=2CO&6EaYVz-`;zd%ec}Xy?s0JpA2LH#8nPqSmdub_Xx`w@f+DeQEslr85hS z<#hNvhX>o;#_zq}JU4o+y!mtSgBSeUrazYZ(rMK*zqqij9-6tFCkv>&`p<>cFWh~e zJQv{IjcaawVQDp0S*NlO{eTM`*sEsB3GAj7xb~XAu)eX9XnjiS=wQBe*`WV4E-k&+ zYulVWb=$E+M{b%sdegB(r%v47w<~zTzxjNzEBEEMYh6trURl-UMe2$33RBPryMhB; zJEj}}ug0b81=qG}vO_(QX@g+w`VL&+02li>fLABX0#obQV7_%fn*P(cbUo|6UfX82 zHLE_Z|9}(R>JsO}{pj}4snhl4tX5A=y-J>=)&Y?wyOJvEoe%cpI&hV({uzxc{ph~Q zG==~dIKahyfLG(nXC+WDNN|AzTwD!ajq7f{9D&rhy6S;rzm_+tWBvR^eQv#7_D`L@ zRV{VdSZgGRNp%$$_<2Gc048PSjO;fhXf&AH6M+c?qP{FYYW6MsYmx0AmHj_w-s!&A zK*J5anJ~rH_mw}C{p?%s7HR#Q*{SCHk^;Pp_dOF|aSmSen@40FIk?fb&`{lv=ro}esgEKeDwNF;d z#kUWu9i7x)@jjaO`xNikhkeH?pC4?elNZ*`)#npee+8UT z@4bLe_^n(Le&OA|pS16d^YA-;BGqcweE99%G`L^Gw#TT?;TN1y{K6;vZtV!a@NVN5 zev@z2ar09Bd}I1pJvr z_z&he`TOH;)$2wU7w&GHojzgf9_BnRo;M4^GdL}t`zEw`hF5rQ{*Ccxekpcy9W23#~*uQsl*Rxgg~>I4z!Et>(h1zuoaR{k}HO@M=r*zM_Lk1F>{(jdIcK zFxKKaUJ6vNcvBBKCUnqYJHbf-wfj*jEj`N zAmbvWM=vttaghUgjf?btU*eXTcbWL*zxXBh6E-fg)0S}&WT|wonqQzldt+P#`%qrg zeogEn_qh9C6X)&zA?7!pe)E_q!Y<3F-@F?!A21BfsJ^G)9Gp@8=I{x><@XA|@NVN4 zev{S)YE79t?lqC)BIStry|z6@eGb3ijN%tQ;kWh~;TPU*{K9YI=6Gq+$3-dy=|=@; zSbcA|$Ke&8XZ}%mhW}um6F0|8p7?zt$3=FYUySxRIOFmRukhUcC*#k?uY-9`+#L7v zJelJnFD?epQwC>Tp5YaqTfZqh!+$W(2NJi(Cw*L`^VP-R8Jux>hF5sre82Dv{~2)dVh1ZF5-}Wx%IKNm8ByI_AYsydcUUHFyzk0w3B-1WtjU* z`$~^Lu2BWA7uorFxesJ}Th6NwiR6Cb%lc8dcJR1Je0}4&Qa?xcsn`y?#4RtJdO^5K z1UzkeGQFZ?=9{0A_11a?@X3|=I~p5Foy;tjaG1dctbI`cgCB<*q)Wg)vm1j!5MSbnsQ;t4#@l)2m2x^CerhQfPxm_<0 z`@raWdELq8i-GGnw;qxEn0c}EE407DFQXCKSKPa&>SgSMUvK~E;CSV9eepty<@Kes z>0LHtUxcjvx*V}TnVWyQBlc4nR!e_8+u-#3wVJPZ<5&KU`a4G41)uPXAHchvzr)Ym z>}=A3k?i=*XFf`~AnQ26>E~CmW$_E2@C%>t&N&i(5Awy3GCO{&s^s36dA-~#NZbX^ zD1NE0Y<|ONOUqB%^e(O&bBVhuM~V@5fpZtX#z4A!)^Qhc7ID|qb4=W2;xX5ray0vl zU2)e!>$c;E?dzh>?YL`L6*}%Z?_?4Zcik>=*3|Pv&K&p4D15tr*KybO`=aKF?oKyZ z-%u}a8T;VZtrv-X!qBRf^I<>5`aW%XHxsFsYsVjWyY82B`$LW`uGBXYFYvDwq(20l z_;tV0;TXtmFT*GN;s@~V+Eb34-lU{Kmr{{7J$Q6~h_k;!#{D7fn@3Y_x8LFJPslyR zk;K*D^z?@W_IJT2{E`Q}bB=WQNg8x1C27-xBd`9>MNUH>}X4eAN$K8 z&eNtRE6uO&?`mf4zXj>*?J9&#iqY8cB>$9 z7dSnB9at~(yu)wQbDwq`DQ$X}Um2&!yxcBGe^=Y!^ze&mlyu{2_=I0Bf_Ki5X~&V$ zrU!@G(LR^{kWNAP1t;w$?BZRQqx(ashpCr$rlnq{z9t$`AcE@qUjci4YYwaAAxTO8>Mb@VMvVTLd z4|E(?eg9q=*TO!O6Fbiw9LJ>{mr9%7r753rt!_c;d2murgpF&#C;Z|E@b21Ej+}n& zJv^>e8_|4(ng5(FP6wx_e0k$vUhbM~p4EvdJ(48An*R~>h~#rY+8K2dd1;s|7K$;4f+^2ZmoAN|5F>3JzT zhd&hfULH4d;;z+!@3(XB%S|~+N1FHh^!f~ApSXUVcAv?#>9OIy(g$R|NyhtBww^bd zb+?;uOI|ORl@Y*sQE{mL5Ba#`A3XQ)T(h2kTS40LH*I?GsCh+KECzdg=aw z{w`^BI{8y&!xj6DO8uSvN%|f7-SqV1_;YZ7cQNfs>uXP_^x(Ywy%_Vd9SUU!|MUIG z!zXUw&+i-V*;#Wa^>}z~P73c8{rKI)>%{L{zc2ASaXo2~S;y}OlE&}*2FLG}6B4H* zH(zSbukpw4+}GBfapL!TRljMx_&r4z6p(U}#P8U}uJ^+-O&fowO%JZT;`io=_O+|L zHC_A;&baYA&pkX>LY{x@n>PMVn;sl_#qYg>^pArxDt?Dg_{Dzk&N(t|{GB#EIMn#`a{TVZ_a>&*vC`#u-?Y`VE%XPQD0$gFVvkYULFdI^sYL9q zrNd6ZKf}iFUKPae#OuWGmH%PlcN5op)9B;br`zj!hnuf}z9UVwF|odXVcOHiWogrc zE3a|2NU-Ut@>Mel2!v7i51GaC-dO^B_on{3X=^hacnDy-VWP_`4^Ob2$4HyS`2~ zQ}x7ak4_(3tIuyNtSsAk#5vb~ea^WsUVXj&@5HZ>aq{qAqy74t4@AvVOnYDcJhMN; zudzd1zfQ)oi$868S5rRw>U0WHUxU+Xr{Az^9hvcC{JQ;D;@9}QYfm}K%CFshb&`3) zuzuaTN&FgV-&gdx_Uo5M`gPj-ipG)d3j7*7T=r|RXSpEtH8?H5R(o#W^SJuEhd3NR z#;>RTLj0O~+kT2Zdw0P6wp&*g)`y&=CP~a}FgueN=i0CDb*>Apugm{d{J8TqA}a^X z`Sl|0EIRLeIL`dGNWV^C3L8qU=lC`D!LPSgg6#sBwBuW8(}QDQ=|RQ(zEU&e`EBij zye9^n7gen79q-0IBHj6I@CwgU|5|v4e}B4C=?(T5L!PHi?`D_JI>K&2<|l*GUw%&? zE|u<9WzgM6@niUe-|jaEzwqwbQ;yPh4x~-*;#|3?{cH4j+VpM?!f)35R#rx|U$}c8!yVzj;DleZzR!$>x%Dr6 z!Y{eOJLkxw3+o#zYe{>t)U1P)>A|5kB*>+Ft`%hd0yyEJ#TGdSTlY<(_#!Y}rNcg~S%#}U(}2ZtJm%x8T_LDp}UW9(bG zt(E}L?%x{Np3+uj?t?Su;_~`|%ky!V_u?DhRu9VM?{k@-<@dj^`A5p7osW*wE-9a; zKa>8=&egJS3jLnu^1jGw+~SR=POJTBm+x$>ZA`!BWqtLr4~8AL=zXQM3z4xi>R+hG zE$Wf|n`!T>pIuG|w5za#U2lhFn|3@gZF(11KI4(?g2ZLuBrel-`NU(7U2l(D;K%rN z^-pEo0)KbyDMz{Z^~>#CqR)r*>*hC$Un8S)u&>a5t=lYv-+Suw>jd{@=bH67evKV2 z`?XlORgm^HIK6)Tvs*K}{2D*Tucy8!evQA|&sA1_eV~-?J$%FZ_2x6guaWkBMV~9b zzW9BSem$w{^teC#8arI}Yq3nNAoGX7>Gf;fR<`SF{20I9{AKZL{GI0knU!D9j@Ykv zZV|smazF88{kpVk{t$kQU+?TQ`^%ep z+kW_Fr|kK@$JbUatlF1Fo*!>)OtY6%l0MV@Q~OG?H^;y9yM90Zu4muCU+*^4o_?js z+J6waeMBSxx8MEgz&zSYl7vHP=T7L$|;d0I7{)=B@AN;!YEq=S$ci_CY zWiENcA_>Pf27R8_``CITYF|(NRPy!pdfovz2hHQZPxYI@C;V1lFZ{y0ZCl~@mG;-M z&of+ioy)jocSPeJmHX523(i61w&oW;;kR~L_=R_yIN|p?`|H@}H?L10Uu)d8K3`uP za;B)AMLy%w?SjlZ0B01xeLl^&R?pO9@NQdG_&t!gxmc~QPiN!9`S9B<2*2R;^XqR< zY5#>!{1-mqopYq&_gc<}mCAo_R?DE5*B3VK8aA!}`h56p6{NikPCvi?xLWf|ya~T{ z-08PzsU+{!noI1zS;kj+>`PfG$hr$~M#Wd~3BT|O@0=qIzlr@fo3dG>$){ahD+s^f z9OS?H{U5adc>hPg9cT!p-HarzhJW^r)a@;;kM!s>YWn%02T2^qbLQ1|NtG|O(`mPN z_e;B-^yo+C)^2~v?Cdaw*8V3BZntkeSK`?2yvXe@71{g}k=##MyPeH|*VZdu>GRy6qoN*RBI+RJ{V9@Y{TW@C)z3{O;X$dv8SiHh(f5 zzu+8HujsfCKH+!fjPMKZ!Tj#sc6+TL?K*Hq@e7~uOFahf!Tj#sc6+NJ{DL!zU-*Py z_=I=Pk$b(}-YW>d;EdvzcoTl@xD#HHlhbaOd52lQFTFgXaS`k}tkmr*JuU*ysQ3y# z;g|g2opa>mwA=HUS6VB`cs4i(`LAvl(+=*pi=QX$V%p2_ip;8Ae6m?T+fXyc7gvVe zX;P55rqFMPr~=g74ET8Ea-EU0~fQ}PXo z@g4d-d$+EfZJb=0zoW5{ye`n1yWdm{e!)rH^=RkKH$42^Q#UjoI&!_9M@sojeFeXE zy#=pG6L%%<*h*)8P{@3vJjTOXw-$q6aKf)^8GYpP3!m`Ib@0wP((s$OV=KGyuzcd` z*6RzxufgdrpZ(+6di;vG(H_5oPvUMQx^`)?8(?2UP+*oSgr=IMUBz&A2&oPMOf-k3f#JD2*2>|GpagC8>c(`9-dr&ySI#n-%5)2?&|(Ca7OV9pYU6Kh42gS z!ThEef7bqcWODhfy>>MGPW?o>@kww-@e7~u+q_Zuh4)~76Nl*~$A6DbF2CIo#px~9 znb-!7IH&&`oKgJ3C;XNV3%~GgXD8)z;xJwKJtR|$)3JQiX=i7>-(+n>{BEVJf5AB@ zPS^7b;1hl~|3LVK_h5dLk3XCG*J+MTBERhs)xW)z{DL!zU-*Py+8OX3!f%|Wjh)mv zclbRrx>3Q9tNb%K8_aQT)Ou{6Y%6bB;9aqr?H0sedQdf6F8C-;QZ_W7oKn`WKv0 z{L&u)zjnWXoiFnXl15nm{tjDv{Bzy@&7~i7MDcU{JM~`)zb%6^GQKkXJn)M)c;_4m zzeyu3Kfh^~aOJZupf#fY4eU9r?DK1I4)R~!4@&gY55 zeCPu|`Je|$97nm~)u-n_(2q*L>gHd|J{_b-KQh;T)q~mft4{r_X@@=_vh{7I-O?4w z{e<$E2f-{O=_=MlyZwkNg9?WmjsJ}Gv{i^K|#r>OaP04S}xF0^@xAtF! zUw9AZH)+&w_?_T>)!vBs-AU=c;2ae9>-Y*j;dke4rhGPj9L(?D?N{xLh~H{Eo&SO} zieLDI-)+;*fcFr769-t6-mh92QNQZWJJRtB&M1E26Mo?n-Z@9^^?udLi27A$-kFkL zgENX>`UBv%YV`}iE0TVd(C-G$sQ4K^;g@{jopU7o zCXKNC{7zoKYHdXRi#>;x@C(jC{;T^z>7Sz?wBJu>GNxY>NxujDd;3APKGLHP{N#fk zB=I}XnOC3gSEV17e$~D{GjEl1WLEvEu_vaIu_fL4s-F*>uUh$OiDR2TB68+e{StMX zKl51Nd{usTqC;Vcj=oxSjzIP5Pm;XM8Ng?#2ibwxFMPr;aVWe8 z^P8ey^}^!f^s%*-+X)I{vGyixt{n6oPK_HuiJ-D_(c!AbB;9ebK(H& zi01cjef|yaX<4LkjT;gXxwktKix__i?=0njx(zg2H%U_UrW94Vdy4>nRBDWq9>FpnJ^qKVN zYnu7ApIcXd1J6X(xY$Ftd}Dn z^zBTGzRhnEJv+|~)<=5uRm?au`E+)~e%n`xzUn88TnyGndi3$05b~-0vC;QQGoSCj zh`!2+V11-VAMd3gA8@f>aBoTUu#d6L2kFtreyHSQ>#My=^s$ezt&jBRWB*O^**5pd zzD=7i6@Bc3YU?9C`shC(A6sAL8qvqTo3=jEqmT9~`7oc7enIAU(r;kvBR%?PACZr( zkNKUnQ*C{uM<4Mx`OvQkKKe;%7uotqkG>hR-!1vr`sgPm4!8A@9(}AoCLeH>AC>2s zdZhVB@?6{cNRK|&yOIyjF?M7hZsyo1b`w*ayeGFLVYU?9C`dH6LJ~lq~ z^=4hAt&jBRWBnNUgyCZypRJGd=wrPS`S5-}?w9wzG2htMM|$+JK8Ae4^s!FK)<=5u zu^xkb!t}8&#@0uA^f6D9e5g12_uG{6fb}=FKGLJFXZo+m2Y&GroL#i)AC5U5759#_ zy-vs3We?7ahBrGG?|W7?&+uxur{LdCZ+K4JUOsjDz(n&r^>xMI8Jtl(-*QMjyNc(n z=Gh1IesKpCq3Sg9bIYOirB}RcZmGV}SX-zs&c)iSC_rmaURSFx%P;sI2TwqfU0*%& z@QEAv(|dsV|N57!?@Oge9)4Ku1E=oMWZeC2iTCt(Lwp=vSE6JD0qFcV{D?u95u~^gb?w16*6?IR&rArHnPVy4F~4r0&zTKm?qE3mo8TeU;d2#^43l zh1IjlW#`T<*0b0vHUN4cy}$vk>Q~5pfLEtG>`j>QF?K>NxWECfuE7Ofjq3=Ba*$VAI>7}F zaP^)g_5!cQWj2Tu0wP6#noor(vZz*7%p&ttNJ{#7kD+U z!(+e&4shYW;MKT}i~$!ozy&+t)wqu4i0djcG?M3waui(M*9wo6x88D9$8>2wni@H)@e z7;u3DT#7d5177F($`Mysxk@<-u8JwYC~q|`71*ozeqqT#&Qxgq-Vfy$IKZ`K%46_? zYf--^VBM=Bo8vHC-~d;}lwaTlS7Z6kY=A^)>D$ZT09W^z_#=41b!M@#oKw@*hZJ1k z09W~D!G+zxbw}eaU;3<0!gvG+xVBCC1>Qcc*}0@sB?jI?7%p&tt9e}P1zvE`h8&nl zf*-?hfdgEdRlx;b9e=HzU7b^9g??>EYLBd$c5~~L%k;w?m*Q9|&}qtj4ID@x#&3Np{!GTGe2|Tyy6Z7PA~C3d02saBZIy zdx6)+wRj;*RIuktcmxNy+NN9u?=D;``L@=;1rBgcofdn6*T!|Wu~A=Gbnh?gBXEHO zTpd%cg4f2i+E`m(%@B;%@BM%a9N?;&{%G)ean0*BYa1CXY4QTGj==>EaP64*8N5DR z`faHhm#ks-0tdLNHF>_k>&3OYu-ecOg>{RWp7!l!aDa>UCV0KLoYAW}RqC(S*YW}f zE^vU0o5yZmTz9Xp&966dbVijqxM=r-YxDKOBmDy!*ZO>Yu`yS_u(7hbwvweYD&1PY z_tVE^aDZ#e^aFs`!KL~!N7eEG7dXH*^KD`;?56uoRDC_`y{9zC6;scZ@05JdMSnTC zxUP@urrp;oTqMt3f@{X$09V_@U*Od|>ekS?l{GaTCVN=e3C-XF2e@XwMeGG$jca}( zH(0>wOK^b$TxHXr177`no$RMdf6y`az4?FnpBJ5v{(y_?z|}VKgj^+lJil09%D8wy z{VoYEaDZ#Z^fQ51^SHFIww8Qm?5?Z_egQ6UfU9fjCGhGvcX8!g2kOf5M{t1yTpi<| z;MKUAY78dJya(w57dXJh^9Wvt$NKsmgLI|&?J6rVxWEA}E(5Q|wccDfmqXD-Rz3+X z$^~#$|Gg={j6ZAtz1^2G-AVOdi~h|U2A30D*T-eXt;pReSI1CJR1FSrbNcUOv*97*}1ape=) ziv_fP@26jWnRpglTmxR6PRE6LO+pUCMLZ9#sk_A=iTh1_pT$&P=a#$c#@~&^4#ch4 zi|fGEJmW8i_4VV3@4*4C+Bv}mUU(dJd=CzAZ7m5d@M>J+i0{DxuAP?P0&mvwee({{ zzh$)_?f9PSz}4K4bUcray~a>)g9BXK4a1|kFO6#)@jW=ewPT)p@Q$nA1_!v>ru+i$ zxaw_ifQ#o5ybh0Ji0{DxE}nPrYFy)p?%g`7 z?f&b>RZf5dT+GVlVKHtDFD_xOg7HJFap99N?my z0PncU3Caadc*XxwQ z4_@$B-z4P;_jQ#@tnsg|tS_hul8L82l_TCSuFEa`r*Y}EJ>Kgz{)g1U*d6r;Zg7IT zb(i4geze`sHqO;AEN-Y-QEF~_LI%1K?{~57?!8{@?q3%Ue(-{Sb5ZbfUmAaX>C8f7 zIUW9X#6GAte(&|>xzTIR&7b?+fVYqTg5c-AG=8U?&|{EFLDEkzVjoET%;-O!8}IdA z`(yV_gA?3c^SpCEI*szx#f5eCu+QZ@S-{}Fs3bVR)qJzq6TG`|&8;sit){ZA$~N?a zy}$vkp1}oPt-!U{{Dt+6l|<`P$`L&4GEM(!Tv~ds*S0x%>b7Htj@&eN^rmBnPMx^D zUrvA*{AKzR%zgOnT36GDS5|d7mwMv7!W8tuuHXO{`z3%^8N-!m?FR?j>EwmAbM^TI-fc{jHa(Ws`|R#h|1}G`&+gXG zyX6J<6i31vJi!~!H+@VF|Xx_MwVI{o56TG1ZJ~>AoU07dT zR1UYK8ZLY{j7*!Jy!MqI6y7r4Z?9dDeb~TxQI(mxeh>agd+w6DfclgAwE1^tpJfw2 z*y*!+uh;R$#`LMv)3ehFU-0F=*X!}X`n3D)Qa`jF7P<8~gy#B?7yBlYxPuRMLInRsdnHLs= zXK=>l8D8PJ@|~uC8M=bdGTC%aWQxXXI!4)6`nWWW6Evg*C9M74#ZAov_>f} zo~H^DZ-X-~&+rP*^dG^02+xTFv6Ct1Nq{FWo_D^w82${-xIDuvJYz@r=Nu{J_QAyK zNIdm(wZ3?6`gIGfL^}rL#dEJ9` zm4b|8fHRC|ET#L+ocC{<{(Ad;Q(VV5M_-!$P@WIfmF#@9zDufahH((aMW!B94O zc;5ax_PM9uJa(Gk3v=o>kC>kqjAeA+_WR8Z&ZvHK_=Mluqrxw|+sK9Aq_u%s)9;RZ zP2{*ptsvuG;EduIKH;~wDg45FFu#eL{)2f= z+#FZq%#%GXvQ?0NRB*=S8D8Oe>Mw+6_z&headX_u^F)q|^a>KcgEKDA@Cwh}w+hej zAI$UK9T%xRzZm^4;Ec;Nyu$O;4-3!mAHs9u0L)WvPvp2rw;<&%ueq zhwz*@5S#RIkEj|ZFDgd44bHec!z(<~e+2&_ zJSPssCVgCFyCCD);Ec;NyuvfQ!awK8y*@5dD~LaXGcM2c``SFit1b8XxJaiU^)oob zc!oE|Md+sw8y8`m14;i0&xbuO!Z--yBAwrpaS_s!KeF}F>mJba^wqkEL;B^z$JSPs zjwIL<<8|u&hiW5=I~&tZ>YcGrs}c?!|0)=d>;Jpnks z!<}!wYhMq|FV8#tMm_gZA0#I@ZF-ovf^qVU`E8x})4+9MNR^e!8+FGALS-5QZ!v!9B4Kk<(G<#ynF1+{0`jbHgY z>hBnF7kt7megN-wt`0wQv$IJjDrU!TKJ!sJ5&N3i_89d!{DRXiw{3pm6Mn%9@0=sy z_aI*kDYN6Zs!HyCnb*q|&wfus-r7hmhhK0;@k@PW^BV>>Ek9|~ySQ%5CGKh$WWEtN zckycsq@M#FcM)e1cWpgU_M;*mbL}Zdv(MNScP+GTJAT-{F6!KlyM|Sv zwc`&2?Vpi&fq%Oo{UPAQultP-$3Sj-89w0`KY(}Fo^s^$CM6BJl!~_oc$Ft z?homWh~F)lmECR z{DL!z-?pi*Y<|P=JN$(G7~}i2>B&O#tNXi}8T)UgApC;U!!M?BByksU7I9bmNfLJv zkNFa*ldQ&}Zd$%`VQpnuZ*wP|-$RZ>MU6vk|CoupjBMR2=gof^9ADV?>z?azsJ#<+ zVV}5uopu~4ZF+dftK6;?q`eGIk6#DY%RKM!8};0$9Y;!=-sM-uDY7oNI|XSkgVVz= zrcu(3tKk!Vxd`4lN2VP|N}C=WYRBE~B* zWQ{YzC;Y-EymO9(-=tk4+4*ly<4_~=U+g)oq(7u$a7OVBW{0%nQfbq>xbhj- z>J+4$04L={*tiya!Y_UR@2)-N$m!SK!{b`r5%Jsph2-zi(fj^`)6>5a*nb9}@C%>t z&N(vexK!Ho;K-|gv|Erk9h_18Qcv0ZVnfQ}^Z|uez27e5eJXcGv>vm&mAqaqDzE3>^@Cm=z58gRP4mV0cDp#gW?`jf$vtEzUJzb3Y8Jx7AT)XHa z@!zQ{RZHL0OZN}-cS)nu$)76Iuh?%?>hJ7N((lmkrl%jrpM(3mi)mL{UwcBO2j}JQ z#h91vP$)b2pYKN=K5+woe&2A<&YDAszvN%{*TF}`@5JlG@2#hr_}#?ywwA2p_XA1e z_kDxo_pPT(oZgo&mh;N7Rws(#aW@q3CcDBI+jo)f=g7rWjM%PejDoi;tV z@`~SEGo#rDYx`%@#qZ#Z8^3Rv=N_KJo`39{HvUeV9vpea@15I=5#NC`Dt?Dg_{Dzk z&N(t|{GB#EIMn2mz;#P=qq)v?m$c;B?uv@P@pn<#nN zK4Oni+Ck^VU#UdwuBF3Hz&}~U@5JlG?=xQ^@jG$7o$c(??e)CF%~wF*k*3-htv>yl z#$D4#)Y_898b8F8y8m7J?SuC>v(-#}xy0>A`}gQ`XZ~vByoa>+6^$d^6~yn@!LIki zw5N^B(xwMjUgK)5lf|g_!Rd+XeC0Ona{L&-ZhcnfGvV*p6PbfwC)(0>Sif#RS^OHw z{lu5ruRk}8Unjb+_;`|CiC<%f%YH3(tkjC(*WmQ{wdX;Q{`gC(iw-}=uXo-revQ9- z5;=#nPqFLkWHVJyy!Pnyv9)(`u*RV6P*?kMZkj$JE!R-gfON zM_Ku`yRS|%PZ-v(D^E22=tkQ26@9M#`lXS6o%X(>aiqHfzs4Sy{aWnVE=YY1PRp;= zp4<04uKw;J4#$u2>+RnazsBF~r|7eH2h4A~b!B0F$VqCF#LNb>Gl_Ao{rX<#y5Rb{ zJ1u_PEQ@SCM`W!h^|qZwd+Xsi^V=f*I)N!{D7l{F*VqTY?mboP6P9_}@vXG!!L_gS zpkhAz`E8p8d9MUGFAkjV;?8e_S9sojw(t!9*cJH(4id_=>D_GeSx49|$ow{N`pfU> z!==*QstmgOD1Ho|@Y}gY_=R`Zo^q77b0BSc7mutD%6fdPU6AolaQgYx*75TTpYXf& zk5YfZyK7H5I@;K%FD%;M#y?M+-pwf=e!B&Uzrbnnd!yLr;vxJOKH-;m1>RkI%F%5r z7tS}A8|$)1yZvkQdD`@D4#IEN`&PCJ(ryMP{F?QBW-QFDf8i5;u^+s1jy$@szOk~F zv=>XwI!Kuw9BM-XC(g>cd@dKHd`a@`n2n7)20W9;@6pQJmS3cvB?Sj!014+2z;xF@C-Cm*Us>yZu~c<<|#F>E6RPtY2@Jq`pSl_Z5Av{QBbeMf&xm zuG8cG@N4XF*{{Vior2WY;Pm>nZY$gMHGYg=w;vI|#@~4!kXiZl?1=rk{4DWnB=-|v z>iYWLNWY$quW&3^;@8-rcz&JFKBwh^%;N{A->*x%<`3b=_;uya#INyp`{A3Nvgi9A zUt77bYF`$4e!Q_U&0bPT`b_sv?JLRN9RJeq`u+I3o_zyw=?|g~Ksn1Cq-ub+L z{?PWjKOH!4sQM0B2aPOUe6R9r{TUpG%QchxFMf@E@avryh@HZaJMV3oOWv?Z!f_Cm zyxzyw8PT{$>sOPnuh;ulf-|^Z+#R=sPxx)WQ22#++qS~*EA6jipJ%x4I+t+|8aH=^>{e=qURbljxtUvNh8OS}occHC*_EbrBtOYFZ{ z##edlOIa(3|AI3rzJgEqg->|r9BKGX?7!KR%^FQU<5Rucim?tBoP+#VzyE`FU+DWk zO#c_{XX0x3m$s?QQ_iNCf&Mv=kH04C=m(sPvz!_B! zz$g5+t`I+f_h5eaZacd?qI#hB^C|f?I0w}Ox}6Q5@H=y*@C)z3{O;X$cBLTgY;Z>L z3!m^yJqGW={O;X$cDW$)5x^P6Z=X-)%j*CB2j2T%n1j9E&aM<>{0f|r{F-z zo8QT4XG=RQ>-U>?3*x`vjEb+|6Mo^dYk21zx!2p-t%CHUfOC-l>UJ^hVA{pq$E00M zdl_DlS+$E#HtS~_YKHgX%CI{_3KDnxIe7ny&8sC&-25Tg@3OTivNkW0`GlApJ zt#?X%i!7Bs7Hj-D?R|kOFZutocP0RCRrUT)7hqVeiWrvn7^>ocEYq?D1Zg|dc6gRj z=|T{6noiSZWHx7kwBlnB&_Ptd1p|s!5gkyWAV^$zRzVpRv~JIc_^5(1E?^Ot2)e|Tw=g+L}`t<2ykal_R`uNJ;j*H@h-rE8x zIaw$3SK!S1UG{xh`Sl~TSMY1LTkuM#{VvY~TmG~UijY_nrq=yc+pkX53BTaX^PAU= zT-Qtc3!m^yEO_UhQ1k0~U~9V1Uxn+0UvN6>XXm<3Ie&%USZw|ZzdIKieyTZtgc1!6-`KLLqbuGxuW`uQ!nU&P>-K+ zTXEPD8;Cb9Z1nEv>l}kxCmOBMI?=>e{LOEG)2$tVPxy^otN4X?lR&?Iy2bCJ>C11n zM*XlcpX-3Z>BcX7!teNXieGpy%&(96XKBAJ)0f{!jrw8X+x^)uINkWo@u}xG!dEGN z;k_`wp5642WxuV{nBN+$FUa~_=N-{F-S~yioc+F8@eA*T`St9kD}EQMrNI7JZngT^ z)joeLS|ffF_xQ74aF+7ZCPS?gvYTaA>woGIDtT~}1jcS~3{K6;vLdv-2oqIyvKl1Eg z>GpTp+Hbf<{iDp?{`du_8^2LK9ss}QxB$EovcABphvgjaKx*Y-P~)K4H`QkSX5}ST zDRTQXG)_1F3O?bNeBqsYLiqLSVLAErv*jw7{q4yb`B&(((hz>ZS;~IpI4I+DjDzOJ z>2$`7YZ5Z<0sr=KP$`e}$OAw5Acqh?j_1rSZ--p}pvO@eSB-vGjWd!S`GkRvtIn_9 zxN1XO`LRu>sxZ^1!m)R&kn$88S5059>i32Z>U!Q9R~>VGj~;TTYsmZy`k~%QztO1| z6aTJ0u9~iq-ya$E=Qn`UtzCgn_-*P{{K9)-em%SWs^311$5oRx@(ag&?)w0z8^7=g zza!@#VZ*NES- zw9ook<8(~5F<8jqYjrw(?TmA71&QgBA99M-;_-$)Z{K9)- zes|q*)l`kf-LgLU1*aRo@Cm>4GvK`lzn&ee={~L+snNd6@SXnb7o2YV!YBN~C%kh{ zxT}w=Mr*`x!Y9ArbmN!t0Qfb>1>lvCaW}6XmUG+DiDGLFi)D)LCrJz=%RRm)zOO2$T*U$6Q?!S$+{)w&e0b0WR zxX<}^aJscC@Cm<(D-^%*ZmM1J>)GuOvEbbQ{)J%HLuG2jZ|ckb{C;qjYFA{x9X{bV z+p745_rm=87+1CIcYfovwci@`+sA#bhe~UlZuSeG@S8YW@eA*T`St4ci*Yy2@3ghw z8u2^gbG=MP<8-xO%_sauZ&dukdtrXPdj0UbYEz%jQ;Frdh;mEw6vzJ2(F zU$hMG+!JbkJv&$yzl&lW7a`Dd7!1GB3+sbla60*Q?hBRv75zn%-(qTKT*j-1rP3FZ zUjFy9*w?+-+_!I?c;f94m-4fpvY4`dmg6H)y$*`;kx|w~X=DxC)VVq7@9J<+ou@MX zQx)3BN2EN`BQLAvkq`2ccPn{q_bWN0zbq_|^vFwnLG>5NXLN7n2c-7Z{@%ZoobZ!{ z<&hqF8NF_Ye2|y8N8wA}pyWhfuGY_)t4raaOkZ&aU$N5<1e8}ccJkM&Nb zJkleNbsgkWOdj(xraaOkk97p(Q%oM~IZSz^M;`OmjzAEq(>eOANlb7!3WPD z>lEzrq@O){sj4UOvqw%>_sBIv{A~04a_?8KX|9T^JtL&gB|Xpdv)9Bs20b2@C<>82 z`p0F?N0nRR>c*3PcG!khexW@H!3SNmzD674%KRyumJ*I1b z5Vy3$`~og;fGd2N(ieEaHPp90HW+W;&=sr3S+Ss)9D)lR;A%)HT;P?@eTP2%%<~|+ zE&H~Zk{^kyke?d#1-OU@uIxHze5tR6Bn}`152C>Z4sd03dB7`iEh13>VKH3b09Sau z(ieCou9g7sAX2`Y&i+AP-~d;$PvHWu#HA0GwkNOJwUlrFfD0Vp8tG8Dz$?=&Y>##I zC1UpERl6>R3mo7Y)jWb%rdt#suDy&BqAzfO3;PAH#MKfYu04w20tdK=240D)H9%a& z^hG@iu2e|1^VGNYdR6*#em_l}>iLcS$>}dqU%(^rz?IhN$Y1JfAvXbp;6XIFzyYp? zx2y7iSK^wAdKDbtN@-l+mAIy&UIhoZn);Q#z$|csU>RX9R zIQGK7@9fr)s~Sl8_7C+JIKY*irJs9U?}MvLz9(S7E}=Tt#c+WGT%*q^eSsHT@t%vT z1H?rN`T_^IB7ao4zzeQ*UGbiPy0#9a-~tD@63;7K;04!3@lB5O)w(IhBRIg7)wsZ$ z!`0mGb*V(jA{4^~4sbPPmA=3WF8YuqGx6|aFjY~Q?YXv2m;Mw*J@0tdL7^z#K?g=;{*<*EA05)zBy z0tdKK&nSI?SK;aqs~X!kRAW`6Tj6-VzyYq&7Zon>+HkF_#%jEBae)I|Z95e%@G4vz zdV?K}%cDhK-~d-z*Q?-FxGZm?DsLUiBT!dTzWoC(aDZ#%1*I?WDqMr{Wc$W=k6l1O z*WdyNxW;t-1zrcP_Ac=DuxRj;A;Av(ieD5TwO!eLof4$_0=KYmRjYSwV1xZ0j}hP;t{-d zTz#E=ap_SQMXc&A`T_^I=x>78j?0?8Y8SPBU#veUaNq(5xF|e$?YK4%^mh!z12jgF zIk@QegDd@K#UtYb64yXStSjCg8yf8G>+h|mF$&pIzWtNKrE!33T+iEp*TN;nF>BTH z02esG71ixFdXwWOqP=dmm&wm{^6%QNbUleI#(%*@Ja9GqL#4CF7r40f9FE@g;vI6G zmD>kg-~d*O}hA?n}16)J{uf#Qw=-d!M)kRj05M0y? z;A+t0nA9KAepfkC`nw75q3WT`Kb>}O))T}7*XXaE@uj{x0<0&@Qlc+#fU8ZH1H9Jr zH3jtqIKY+C^(uI$te(&~z?ISSH{cDvp15?8olAHGM-G?f5xoUnPw>2hEr(0v02jZ5 zcdF_M>IHB`v>!?RA#nxc*((i5`SuU`0tdK=174X<`h|fkLKd=%;liH>*Jz`v_wf5A z{{mMvmik&nPU!LO^gb#d>r3$uek=MS9=Jw+@2pp4{A&33^0vtJ9|EX|+cdF`%gvJ3bo=5ObRXqU?aA6H?f4~I}aHS5_ z`qX-r`V?TqESs2{%qOq-D&=y{+iW3G{z+VOL}-t1VwbuFKX`NawZBZc_7I6B{=VLU zPO-4l^OCKw%Q=MR^I(rJ@qbTj=p7e-Iouj2xYN2HL3yO!*T*-+hPnpDYA&&+-XjCq zwWXh9Q}6cpO7G77?BEA4_{R@c&rM2~OX81puj`EW_`@H4Yi0QD@%3{f_sZ+P{Br|d z@TaxELAhjF@yvI14v2@QJ>bOxBCniYH4bo%Y5xqolX0~Vbawaos_R7dML*yI2e`&{ z{ea%2fV{psh6Vl2KLcKgOSTJn-HOEyF;A*31Y^>7-~tD@ zIL86JGGR3^C0+QI<6`np;*#yGJ-*aUbFx`{^7aExaEmC`hw{k&(CRg@o@(u$YSaC$ ztoD0#b|F#KTOagEJaA=oKZ5uYm;c#)q`8OS0!I#)E(dreu3&Zo6~>suW%MJ64PJ?B zGhfyql(;hDf#bZEOU1Q({@gyxSE=(;8<&f%E`$AX4?d}Eq6>cZDF=W~8Cj>!n^I^b zm{p#@6a*r^9KTPE8;@>L;fOv@v~64dy#^9)(ZUoHYNu&h#i=L#;-DfkezAMvH+npcYNdEO zFSUd}U+_IQZ68+WrG-x{eQsJYe3QQ4*0flCx1ZQ9KDH`diJl18^mYw(d#5er zH$6CJg%;E`ZM&~JM3ni1Njc&qYxjw7$G zkMkVCIV@~X{9ojw`rSK31lmv9(}sIgdrCWN3aHk5-e=W3`w-ni8FE=^T0SNpv+QI~%2RP!i#ljAGkbbIdwe8O+^zZJjmZkEUId*f{U zHZJqE+cg+|lP=?~rao$Y55M4a;}<^RH+in&7v4?$ieK+Xb)3~5+ZbFV4Z zU*EXQF1OO_pm=UNwmx_Ur@?bhjV90V3eO|`if8!GCDa#+XYcQkv+>+!%C6)-D4yHu z#Gb+Ft1@@Qu8{?}@clgzCT zdk$-yPM-7n;YyC1$@jZ5PH(=?jCjm*5Hfzk^D$FLl=60nz8Ui%%!@?&)Vv7kkxN+R zd69WR&5JaAO#7$pDr|eJGo(Dl=0)1{du|Csp&P{d0{PiB=0(sC^+mc_=|`1u^1s^8 zoBTtW-`K{@%S=%$S}^10nK~Ia2dCS(Iefxz>O#dYyqnrp{CaH-#GbPJyw|jx7YWBo zuje-PQR{o=MZoFCFMQ_sU8wklcN4$j*K>C~G~MS#+Ulge2WPSN-t3R3G_UZSn6G$- z|H3?b?v96S{`<6?7fIL2`V?@M%QL*f^VkZ_v*y1r&z`&EcAlr@yvS&s*fTiGCgvMDe&+rP* zV<#z|;lBvao*l7iKQB@zJf|w;8D8Nz{5Hii{1@Tbvm-X$=S8yf>%*SGS*|_9D?DfQ z_!0aU;n}kzHtpv{n(Kq-sK!|?&+rP*@CyIj6YlEsB5fzu2hZRvmuJR(O`hS^40rW; zk^ToE4fO<_0CI!uv%=W6EzK9J@%}C%aWh zdCCuCttxKmd6DwvO-)Ss9BmQvVd$mY`od}#6jz>r`%O=#Gedg4`D(S_TJ8W|+1qhZ ze9+5Nh*Ys}%H=$we9Wo2%8i?AoR{nMrUH#Vdqsw7ADHAf_q^+PZqL1H54;oXH$7UN z$vkG)EtDhVBT>7&q)v?K1kouGb}iN`E;#Hv;%^Cl7kt7mb^z~Yt`Gh4|eT(27{b1LTZWvM0-r%3A zlXZmP#IAFl4ogA#{xW>RFLnU$d3~xYYc$EL(`-PL~kkH$6Cl8qdtsNxKYAH-2faOn%X$ z8Cv|9UsiDMH$7QNe&u*qqRRFgt&{O;aN77qHCBkjdn%pi| zHWTGG4>fwdYJbPKsW5x3Go(Dl!pME9UqdMN&F)g|GWx-;lkY0+ulOCO^qW4;T@)TrGZf;d!WJo%E-`>Eu_iWz0jtC;Y-E zymL$uqZa&C`d!yrzZ70il=zbJBM8SnrtXtJ zarzgdcfELrT$hrFZ!h>>o_yx`U413rZ-66#Uqeqh{`(DL+_XIZ-Nz6VkOB$u-*ftLZ5I>_zy7!1^e7`J z|9$MF+W7BjpZ+^I%k|%R?(y%6J^$#}um9~gJvf5$-!pYGj|NUR{~bQz7yZFI_k@1^ zZ@=lmA=al^{j+NO@0mLB-@)nTztb-5_TMf4Ui-AtSK96G>%N-Qh5Vos5$@KH(nl@z zAoJoc6vB6xp~X&te=7Cg?IQ5s@z?R++upDIcl>&L8hPFPQgc6VW$P7?*OCwiqs1EE z7~j;`BKDTV`}v{FP>#Q=ar?sOo0(#=w=2J$(EQ!~-dexvy6(Ymx!iI1i-G@+9?W*X zm~_8>ncwu_3Tj?0U88w%%28=3d7C2=fz#&KIqGff8au|WM>Z(C#@@~R1F&mPN7`0u z*KH3fyCyWt<$f>i`uR%i+EcmQarldYU89HHcCGZ8trLG9oHo0*JrHU&MAl{V0cLycZKdk6b6Ojh^v5~|J9~S~Jj%J3cD=!hSYCS_{jRcW!gBI( z#*ub?(1UL46#bUVnP>Iyuxs>Cu3dX$Igj6O`n;rI&eh4DUz_t8^5v-PiuM|uMnC;b za~~OYj9rg@L)kUxPS!U1RU&Q?zq)f%R?6dpidzT%@Lw=+$6mCS}}9 zyS~ASSGc`S-=OTc;rl8a`Lqg?X%(7Tgwqd~v%byMu05#2gc9gIc8z|p>xRvR^#T~b z^ILw?gJVW$n_zxMC{gA0ZKJ2uW`2xvR2oX&r-9%9USnRK95K3 z532V3SgKC;iGtI~uhfo{U-*RI)cX{_@SfMFx@wIN#yY#qZ_B^;n?9dYF#KlgWd9d9 z4Sp9W{R}U}e&G{-@mJtIuTOP#Ztu{>L{EG`ozZUo>VEGxeLe@pZ?(^@OxMZ!V{pQ+ z-ruL^!ffrY_CMhl{lPo;gsq(egT4J;N3q1J1E1-^Ar2(4{H$u%&&fJzf58dAdA&I6 z=Ul%+`(wrW7o_*Qzt(Sha0q^_^(oc1-*BDO&)|gLV*7L9)3jfB&+AiN`JG4fn;tx3 z9x{;qA(=XvhXiNg`3g}_ivHA?*aASmf3#$ON@|t057wHC-TMc2ug78Ci(`IUJSe-r z4`h9o)BcLBKN2QweWZQw5H`(tCgYo#o7DIw`NvG=?_)m0#NeUh1r`+cQ$oqkx4*Xqzc2Q!AW zYuRTh{oYfDU3(~(nQOK0v1|0P+pd*{!*ycU;I!NIZKF+->>4}9uCw1Tt}Zr8G}Y_`|f zF?OB#in43$o#%nDT6W!BW4n%gM%gtXyghWyT;zlhp)N8T<^QIzjvt5jOKd3G(OnKSyEocOlLLB2&uC< z{*@d0ed5+b&*ZP^lgf_AdsW!ALm zS8=BAzt}bU!LG+|b?U_|f%V>&cJCbvFC3c~dZxQ37@Cm=+n-stB zZW5>XJ=OfW?EA9@8khFRHw|>ex++{LYGx74ymYok{Fb!(tg3|#xH!rFYOq- zoB1k!=Xvffw#5b-t7F5#@SCbp{cP&B+-4K7zxbQ*Yx03Gdt!YJNT2Z*}Tsi6)qSakx&}UvQSPU-|wI`hUFtBi9eqgwk&& zq(24!oEs_I1u2j8$kSqS`5=c7KaS_jE^mjZU+AaPZ*S_?-(9!go{ZPWISSx(;}<^R7e3*gd%|74-yZI) z4}QVv#xMRR{F;6zyb?~Ie!E(CSnc}Ke6d& zDjez3{eq+lDNn;*e<(Pg&F}f}*JaIT`z=>KzhJJI&qhDkb>wQNUd-HeyKH`4_Px|g zXV1p6;}?$@%y@cweVx?X8mH5)C(oC_C;Vau@NVi?@#}fGHMFdAV`8u>1P8-!vQGE~ zryIZU3BT|O@7xpm9oJgey{=Q73+$uDR!HP|vDSGutGhle-?O*8cYS^HVdZS?c>g0y{;1`^Ee)GDK z>x5~4;S+v|1@GJwYJNQrY*lYQEEvB!RVV!>a60Sf(4=*u_|f>)iBaWO<8Q+&VYU2f z%Z^1YEvoCDczte; zCKIZ>l#j4MzlS>dc|Cr-VAf*w+pe)r6#Zb=(GNNGf*uI{`qeG5fq3J>#!99X$=VSH zwN5l!qk6k3?QcE;oUZk@<`aHXZ&&=nyF;ns#;;#(@w;gH@*A!dzhCmlFF4)!g-`fR zyi@U8%#Qu~)fT@k)0f|9jr{7i&-vpQoNoNWC;WylQ~bhvVf*#$R);KpTcuf_{juC?^^2>0{#ayVZTd}_`~2|>&QgB0 zTn_-B@SFI(vR`;F%&+(PV%`2)-KS~EZ;j?7l0N;bNE!1Hl3)0QU-}vFUWDIrx;AD~ z>t46N)0W>%jmD+ZxBBB3oNoLw z9ss{7V_X1U30V)|)x&a*cObR$Q1*WVS;t=^`>njhDh2y+(i*3me+8fLOTO^VJt6#h z^{|}$`q^?7%sT!|os3(8vy}bHb@z;o{yCQq zatQI`c+Twdc1Zs~kE1fKI=V%TGm;+pgn^E$&ad9MYWhD^KP7pl3L}40er@vA>Ynlx z8&_@8{j1bnx}LYjRmWW4qlet-8Zuv!(~o!t#Q&kl>zsNq@$c&6s+k(?4;$6v^`?H^ z?rB%R>DI2mC+$k~B*ibhoB8ePT*)O~o=64q!SFKU|JHE{) zzZ$0-zwima^fTbS2*11RxN5jo_47CU@e58je&G{-;S=7uC)E9;U3XlyM)M+VKJ7PC z=DbL5JV5t<&2a&EC1l*qtB2(rcSCCBVNm0$(HhNbR$gM20{;q}ZvGW~n)VCtCJy-Z z>R~zgoqpr0;X2_LoTch#Ij+k19OIz5aXL*b6P-}~I`m?O+HWwwF8iJZ$>%OzRCby|5d&MVS|h(OqR-1MRJKyz(XM1Q zPPcXiKH)bpTRs2qZsw)<_3ZYC;Mf0tgJ9M}Wop!}MDF(I_k*)kyCVDT@Cm<7M=E~d zy)eI?-G0sQ{Kn~OzsVZ$+pyIizu}SNq=w8peec1`(XHu*2urAw6w&BUvN74 zoxIOJ$EO~bK~7Th&OM>#*Rz9V@w+J2aS;MNhXL_hqj^oQ#m@1oak}wKe-Zn2%a?H( zuO604@0N@E@3UCXxY*ohZ=F!$?a&qXY^OYiHWCZt1#L9 zORN9iwn>Hd@ewJH^vE00`yI#!dC@K|~!ps&W zXY~5Q@<@-o@I9*h5-S#^2jIrAuXpz<2y~2H}R#y@<@+7 z-s?d=4fiNH<0&ootx8_<=ECwwk38NZK|XEZ(&zh*eN4&W++mXs(j$-aOUcKSm;8y6 z$GO9%JkleN^D@bYa&pd6!&W7ab4yKmq(>g(2jpYQ3*W2p>GN()d8E(D)BRQQVLc_| zf~@ak++dPCogR7gkH}||JiRWQeyS;t^vJ^>r(eyuB={I7rC(&qBR%q>y8lK#raZ<; z@xx7dq(>h6kI4sI5<2NCGs)laZWhvjZJx^ zM;`lQ$fsC&*{5X6BR%rik3l|Tx}K-J*=v>kvM5<1e8}i|Kp}ahQtamcy zksf)h>mVOf9?u{1GNwGzBdX9a&mZdtOnIb79*!UR z6vM|l1-m?J9P>0a?t!13o~iDUYlisQ=J(~^uU^w!6<2#kNS}9fp6O?=iFXWoJls$e zVx;-UWzI*HTjJ`*lYVyChI82H|B{>iy{M9Bc!g);B{cus6KbA4_m@|%nK!L@PM%mF zJcHAX=d%}zJ=%ij@z(Ws%Jbdk3nIm>>*wr+mx$8?8|Sx+Q;IrcT@}71BQJh-{xWy9 zuK>_?`eaTnO)AmoLKRFDD=p~55GZ%Gjt(G9#H8dDeG z0tdK84p+FqE7Nty2HP)=2QxG>%YY6paDc1fWeOK~B`%??_P+l3K-~A3t^q>a(hlN)w>~x)Z{N@rtH#-`pqLzj3mo7YpQ~_zS3dV0`t&o;gXp&GGrHag zAE5H#rv`liF5-b}WPfLTsjr134j=>%qQM0Ya5WsNaDi9iT127%!eY3<0j@D!zkpZb zY6$=jBIUa!?H}|74sfNkJ%U%_(g#7?lUMCp%C~>O1rBgU^>YtinQmcwtg9~(vnQ|G zbunDv09WF*>iGh%Ot&aNTzeTML|@5F<4 zTum=mJW}7<>s9H~`TZncrQ}EUR3Y-HFW`}Q;2JgRVX3c$Bn}`152C>Z4sd1la}QpL zYbxqhaDZ#1N$D5764zAJtKa}v_$Y-7yb{+`)T`hCSL7uM7kDMEsi;@M0j|+K6fW>u z&({>x6W{-rwN;Odg+`VZJ8ROh-FE^vS=x|e$H!3(Z<&&AaN;vxlofdgD^ z2P$0P1=qT+cuzoGTL)5bfdgFQT3_G=*G2J7j`Y>KDaIo>z?E!J`T}nbS9819r4l8J zPz)D1z}2v~!UbM%(T6OViH9GH;Q|M^#uh7F;FbPY|N6dmQCG;>IKY)UQ{e)y#MRN&+1K758|>_@K9*uU zf&*OHQxz`o%5)psH?JGoupy9=wZ6386s`gJR;KDJOGqq+3mo8zo~Uqv zSK;aqs~X!kRAW`6Tj6-VzyYp=<`KL$T7R<+p+mT;Kp#+d_p4ymnlowixW_t!@XT7?0op*Vxet z7kEuv?Hf9~syR(m3>P@SmC*G)cuibgL)AnDd-)I^!2zzeh|(8$C*kT1wzmc@aDXd$ zlEMXE6W99qV63w%U%qNzfeReq%IN1Fye6)`c>h3O6~RdP_7Awg0j`mGN?+i$OTOK-$~9{-eSrg9$)ySxcEaGj3RSz(eDRW!^w(A#s?&> zfsR;LygfEF*xT3NTTNpWvZZ|c2VCF)*T^!33%nLCF^*ZQo(H(V0j>t^Pk>jBn~3(h z*64yYYb3*`C7g;$%a8WOSEAwCK`J(=i_PffF(%;Rf zt{)S+Uyn4io**8$qBX83z(t6@zyYrD*C~C0cdF_MaDc1n6om`CQ&mrZ16*zT`2uh7 z^~9x%;82F}2o7-ZJc2jqdV=R2Y~TV1xcD8sQ&mq;FMta_lKMm93dXZn8j$kspPat5 zKMOA6fLErIeqkVskcI4GxbWw})pnt>NBn-tzraEItB1bTvOrSg9BV+TF>B}s&*S3 z;EL$+d+-L|ZabNTM{s~^R6md4wRoHg|6bz&7wEw&aZQDPPrU%H#9Nd-Qh!MMt)_q9 zaIBKwq~~AJgIP}y4_wJ(rbj&i4sfM(dB8hW^#nM;6+J`g3%pZRPk;kl;~E!ur>dR+ z2e^11!8=v;1USHjeSmkW>Iv!vaN$Q%e@I+Y;opM;T<8nD64zAt_xSVRN}jLm5x;*A z@!(sy(IXe#+(4YfLO3?(LKHh3|#)0#l(6dIbl#qA`UFyb_me z7xKCliydN~R9gtfr0>854sdaf19)Y^YG6va*tZ-w`Xt2d?Pbobe?t|Fio#(=q~ZfdgEW z1H2MfFgt+?g9H~iz(s8EN?e=yvIe2Vl@Sjd=e1lauI2OR_F2A4ouAscTx@k2?2mi! zNo5mV@Uvez0CdX8I(6QZLLM$JIGDkwk-$08F`f&&}AQrO)fxxn}&9e_SToA-OZAU+P&MCv~{d%oa%ZpQwk&I=rQPKD*-DjIKF(_;18eqy`$*dp-; zBk@;%AIbX`$-CAM=Z=m3tF)e04)t${b$GCDts=ka(X>3rS)Q|>sMB+tqdwk$D0zb? zc;oqoPxM5%rnhUT+dFL`zv;m-E3}}ld7~VahS(cC!5ebmlY7F}&VjxzVQ}4|gUNT5 zgnrYL*No6M#aornbBvr+ALsmmb6D7(_`k?U^}Bb-dR4cdw5Ls5ReMT1YYM2=d*hbI z2OC$fX>4xv_yW27d*dbwwxW?=r^}S0|)yvg>Z%x!?Janpgl)TCD6>vJ= zdl3qm=d{8n{6-Jae!8{`vpjy^8)xIUahb2(uEFq|c9}mg^-=44_ywmMzwima;XQTz zR>Y1Kzuu4PIIBChG2XZ&=I2agsZ)90vgHp~xqWUrxjx!wa1J}$XVEtsUMTfr+A+Ms zbJI>$Ps6`VWB(|gy}v(hx!gC>)wwyozHymdZl%{j@f`Lx~;yG0({x&$BJTpf(*`DDQp4*;R_6+}~?iJ7TJg<*! zsnQz5z<8ctANHKmI4AS07&Gk|Ug3H41ZB_gUxeoq%(?)5&w5Ez_Ri6`nJT6wmOV zPpPgn&z>Ezl~vjU7ZlIqb@F}_aF)w6yuvf%NAO>SXU~qqSz!aw(f%AV(Y_QP!Lb6c!yL*t6hq^A=pg5o)RN`17?;52wXUGOCTCiR~g z?=^XbS2NV_E1K`s5%c%fs63h(y#KYz<0P3nX`jLA^yd4_h{rq! zA>$`JA2W4CDQ|}un_(V=d6CGqdS0Z+dV?y@i_8mZUS#w)s=pcjqYASJDL;k~eHEJ* z8ULPIKSCG^-5}N%$j`1ZFM@ukFWQ=wepDGJ|EvAH$v>3&jcwe#%oN3<1v73Qt&?$c zaJr3~!zcWvUatLkZ5O6?6~A6v1F@$pKkqd?=S5uBdz$*F^?hz$MB{Yh7e3)PGDq}gc@gG0 z2pK=&`7q~2m8PMFG70qCrmze>Yeg@bFnXCp?taZlK$TA77u5atPt!ariY1{%#&A{-}J`P=L?blRE4>D5slNvuMJY3U-*Py zBEdWNgqk0#&gQ#HLci(rd9{ifduFKG`@NDb=SSu9pPDQ91!t*wuN}gEX@_Z-Q|nc` zOnYsXV*Bt@#<>XMgoA_`%l+PLmn(f>WV<|IW%KWX`#8f#sP;GVs2V>S|D`i@M`*^l zVV7!`(GPY#l2Q6GOU?b7Sl5t`?e!tQ>A@jR5E9JKsJ>k%YEy4V^m!`z@|1U#vulmh zY1d-C;)27zBmS1)cflw8Vh8YU=4$cN-rVeUp9I+SJea za#VJO{ep86zgnD(w?p_{_*wW}4Ifc{7yg);d-H*l{I1UAxl0$B@!alBzpGLa((l@6 zWm4GhYI|Jy5z!}A*zh}N=!S3d@6zuY`HHJaqr z=@KIRrU#E453$ZysPcG7bVF_G?QwnX4&^B~q}~RnZ9Jslco%%aFZsYb_k z#BX|V1T~%+t`oltoNoNmUYY!&M>DkeF~6+f-fw!clKjf?u0)mXH&Q43g44z?s5 zQg4IP#xJT7q0O(>^%(pT3EsIU^gEB_H$6Dycy$o-P~ke6hXN=4CiG(8mm|kRXoqQ+ zM=w|HGVL|#2&**@HMw1`Y$nQW9;%^RwZEyGR2W_13@J~sF!D{cZGv;TN1veuWfc9tu9;mwe!zdqVj2IwVp(`weCuDpM!?g42y(+AEV^_%uVm z{P<0u#}ka-m3&)m#xwKfsO$>+1?MDwwKy41o_~U0QEZ(reip7i7J z+wkMEHz+@j^g4PjsMfsJWIwL5nJu?@t?WkSmt^0i!qHDU!(4&NzL0)g+XK7GycYVQ zo`}Rs`*D8frTnJP(-h3SR;I5$>IraCPZXQif=~Fx4&XhnPjzLDYwyDITG_7J@SAQoU#rjGGms$=bWnM zka$Z=>8J&Nm44T?)-Q$E6Q!?Kegt9UQguHTb@~^H8(+Lbu1iT>vAy7XdGeX#clDKg zzg@mu`IOV?O7gx%j+<)zlxx?1&zba_9v#jIJt&wL@3*V+IhDy8oqy8wE${7eSSSIU z!-7Ncf00jq{)6Wpp3Udq6yUf1^_w0%VqMY9Al4;h>%_kXXQ}#oi+BLw6MoSjymL=j z*(?RA@}b}Kc}a@jYVWg(cGpMy3{Lt_dA-OhWxoxx^X<|tCGB0Mk?GW*s2gU^(jw(| z=Ev)I$j_%|9LJeM{`WklNogJZ36UP0yT4b;+^vVY(u4E)e&pe0XY%K?jr`queW}{< z;;lI;>@o1)@z?R+Q=eA;JAOTB39IeD&-3cP&nWG`C$3R`I$`)cb>A@J^xr90`qkz5 z?>C5X)AIaxA45<;3M9mTM=xf(Uo2C<{iP;HBLAG9X{a~{lPo;gns>Rzv;mt)~8whvugYAk&EiXe+Q?V z|4zHK+kdzGd+pOoUun0$uls6J7xIHnM7Uc&N*}ePPdudjcl>&L8hPFPQgc6VW$P7?*OCwiqs1EE7~j;`BKDTV`}v{FP>#Q=ar?sO zo0(!VN#(Z_n!mf>TkBU{*FE?xmpcxBG4S8fgW2vElkV3q^P3)ALCvdW>tx;(oHoDC zQEy|{*fDmU{H(HT>>Yg)24L5oj*md?2W!KodEs=HEe1O?rdt0fx z?3~udCH=9E!Oq?uGmmoarCo2ZB9_-)k9I1%CM+ipXB=tQ2R-PvPSJ0$!D;l<&ouXuVaM2Y^mgrs>vlV@Pjyu-yUw4h>7JFpQ4?c3#@Nj-rG4);UYDaM6U)jGb!U<+Vu@qyu$5u+vVDhSE{gWg9@XcQlXhe z_G=H9v%byMu05#2gc9gIc8z|p>*P>jy#U7V{FdMJ;FuBGCYZ1O`nE)!ygvk-!@_p$ z^WEr2h57Yu@CwhV_1Ye^eK^yFLg$%ZRCw<pWt-zE4Aa~H^-;8_wjX#UwF^! zQ(d*j2VgwFyp^b^2 z_<%a2-Tc-4-f#MR4vODupIaHN6Mn%7zj}Y4o(s#jzwima=nvkxCv5E;80_u$I*KL6 z>wKmMhd7WRkoq}OC*vaEgx|bgob@yP3ivJ7zaYKe{k4A6gG2CZtxu`8{U+;V{}(vn zx7hw%_=I2d2k+by`khDgn;slu9x|ByA$4NES&g&se1)3V7!z9n==YD7>`zIpvi8AR zbFq8>!0z=ptb1|HZ;JyhY4)eA92aa@hrRLB9$; znC*74Z2itB`c0q570i5OvQE|+fD^w=>gBgjKKTZ7J`y{|uG_w^>>7K|>r-6?V%H~` zxwzj~Y}c!`UF*<22Q!AWYuRTh{oYfDU3(~(nQOK0b9Sxuu-mSchEsJiUII?LUEem^ zG|8^9W9&L{wX$pM-F&X9W!LjU{@%k^sa+?p)8q6yG|T0FFYJ2wYFE3SuKV;TA9kJ7 zhigAfrS#k0`b`ghIZhVHIn;Hs&LFID+U;8QmCg1VJI1b~*C@Nj-t+oYSJkrX<{H~| z(-)Op6Po36znAUx4X$?G>@H|ZV_?_lq5j(IV9q&B*GYQ~PN!XmCa)jTc8py&{ZQF8 z_HI6e%?;*y-=+P%Lw#m6*ZZaM!A8!K@-k*Rt6@e+oz3yD+|ch6w;p;Xf1_6_J097r z!;h%2?Tsn~;MiTiFSu?f@_n@rx{33^hrcH5T7F9V;VRDb{TI7NKiGA{El$0dC9vMx z((b)u;e}%pgS-#weQc>3&3m+c+xz}{xsD&4g~!G7^Oo=lzil5^{KC7bTgC4w=GSH4 zS8?BUAoG^V8qIr*QD2m;ITcabrQ{c!rRwc1!pDYB_-(pG@eA)}_KM$A&9BS8KWm_I zX@7jvKu4^r!j+NFHm@6~GeY`@j?uYx$2GEyhwA>efLuiz7Y;d4au&OM># z*R%arr*4*L0_qpn$^2AW<1A&r*84wn|Bv^7)`->9;rhMD^QAk9@+w`t8RxH&;?=&Dy(kzdi9;<;P||q{7G& z6(&EgLdsLD-_Gy3(CWAEI`0!fKh!&8w>kBaE4RK-e#5TYZ;#ffT^Z5u8#MLnc8}i= zPPcXiKH)cdk>VHL&HNOBcX7!Y_QnJNJaUdcQqeC-w_YH-2;erl_mM z{~^=wgjd4p({ESn7^?lg^k|LdMbKxZVa~tOINkg!_%!Vo-p%}{Prp5wbt>sPIhPKc zrR-Psi|Gf`FAm?W`o;8@O@6D@FJ765t&fWp<6XU#o;0Zt<>#{tpNEmXS^J3tDh&6l zFx{g<%GI#f9}3QA^Lsx0by@S-e#@25FPJN7|I)8UKiKv7JDqwlbJy*%`E}X%QZJo7 z8_SMgJYq28>FFBvn~ImK^e@!g;B?ycs@rug+d+!|WexiK+V6@r7| zH(V#ARy7e3(^KH;5vLdCE5ajk{j>pI1`z&>hhg+!hgYn^Aay6e;OJ$uW0*T+}( zc3c!6^xhUo$>BQjyTF$Fn)EWPV5() zd4BV{k?VwMf8i5;i3RW66KZ}v4{TL$J}el&I#VZpH8`F1b7;~!QT%B9>hxvGug2eo zSHf!f)s`KLT3S@sJ@Nj=mQ5X9@y2hf>9jU%%SochU6aH(8_c>XGmGn{NWA z8^7=gzp2YKzeViWuU~EP+cJImjn;_Y^jG}x3r;tF;S+wN?^gW6dtv+a>{f>?ep{z6 zzo{D4&ka83i^1u}FMPu9=yJs`ycg!zvsK9l0e8^~x{OXL~^&T2$ zDZg5dTf!&&X6{h@!h2zUz0Vix_Sfn@O-FtsH5#`Z(d+w6{kq*VZV65|e&G{->1V*Z znVte@Jh&f0IwdFbG!qom4~wb8^k*PRE_-S%1f+LP(Opy z&A)=bjLLy?R(qe*J8@3T7RDxK8%bfwPqT%60dQ&#~@4H%_MsWn7bxaS!+x zQ##g1K37s6>5->@&gFv~Li{+MGrPPUqWxeTm2uU`BWj$H^vEX+bX;|Q^~O~j&Q*SF z+mBV4O{;M1aTQXYV&kf#-%$PM#3S}`)iKxi=plEyhRm0sAL^aVTbz0^@oT@q{JQLW z%Ws&*bWz1X4aZtwR7zfRb)9H*E z*Cb@z1ODyfpi&;`kq3VAK@K5)9M73uo*Y+Y9F=iZs8a=P=0LoCn}7LJ43{ceDcXM_kkU>ORZN$Kh!&^KPvs87c=xduBsO#pSyICDY~Nj zpw_EKYEQJ_=Ml|ql#a6FU+r3uOEI_ZR+!RDzSVIh}_3n?e(h3O|{|I z)N8r-`2FB?;}<^R7e5r<&3v_g<#|6(%TQNWvzKTxn^E55M4a z@;iB-J$%A1a^RhNLd~!DaaGChqFBd82=p8V!*8-i^|RMv!!J19_@%#S@>?u_#$~*E zSSo!n>E(Yvi}j3)&3*RP2_@bRT`52NDT^ujmE$83y@p>g_^&p?7tx8VvJzDNTN>1XM!tzLuJl-QgK3R>6^L-Rt(VKh=~+dgS4clMmyP;A5PWevv7U^vH|qc{%bi5<3&G4jD~DKF=Qvyab|M|$M3Ux|E7d7Kl@dSg=_>5<3& z81gArUiK-O@<@+7_G6F_^*rT`u2A;Nz8F&;>5<1eP4X#*kNr2MJkleNb%ErAJnV$$ zk9i7H9_f+CIyCYrCXe-iraaOkk9AMvQ%oM~&rErwM;_~J$cN{J^78z#-pQ0ldgQUL zgM3VRJb%o~nDR)EJk}AAPqFf{p2L(!dgL*0O+Gw-l$Ym^^#i6n(jyOtk9>;ZW1WIs zo?L%4@_qHZ<7YSgkGe;$8RBP~-1T&+IEMv?;{Qn>`+HF(&+rP*B!GYJ2{q52`^&4>%$wFcH$>`#XK=dl zeAd~aP-YMDzO`pwyhEPv_F6$?q2~gA3C}vaJJ#RX+rDmSaIm-MxIV8(MN+RISBCqS z0pR%K2jj`Xq5k;5g%%L?uN_YR#&xlICwoU`N3{ETw+41=;QvPrP!&yxhS6UBs2&$@ zIBL7q?h|J8IM#!g?H>xw7AeFZGVJN)*@E(K!0*JY7CLhF3s(J2=*&y(>(t}CmLDK6 zf%jD+Vj+B#&%K@z9i9v3$F0D(xhp)GBNoQAlzyuNC{Z!{4VA1MQbmQzL z3tQK=w~TE2@uHD!&o8RCLX3=F`G>zdEZ$iHIUPH5!ueg0cO$nv-Y@Me{hQ(aWH=)< z6l8We+04IC9~>-xk@dw@!e^A9rayf1PU$zwcq8IF?&WVX-qkCXFWrBiL-rAu`=8a; zdaei?Z-5 zC^Tzs=c?#n^z3D)b@X;07n5<0OLnXGvY&otQdU0VjqB^;8#{Z>nEU6iePeE8=lV0| zo_EsO&1d(u#1oxuoBQJ{H!ok+vH7BoQ`gTu^9_xsCr=Xsy5obf#$*MD(T2TfsI%BQ^6+L@}II6Qh-gwe+Cmh?+Ja1m($tNE-@5GZ%K6&0Tjq{u5 z%|E_b{D1PX^G-bNq?1pZe@dhN%oVxyuitRmxvfidUgGYIxrxESzSE9B{*p^BIqs4Z zj_d8;c>KImPd!!2m_Pqm5#!i_O+ACLSrC-1tE6 zP=ALYZo{i&R(+?n^v7eOTfM5cw+k(|ER zi({EzH0|*M%<+;~8_|3vo*sFbdu+u`?!k}uh^M_@Jk|$vcCHYX_s_G0K_(x4?7Y|a zT-iM5-Z#Da$e(?6-{0PF!DoN@!B;)`g;N*xTsQys*Bmn5 z^V6Q0_qEL&p7obuT)Oe8n|{6Fu*X87qkq_X%gKNF;eXt?;+rGK-}}D%kN)E2D~~;DpVjYu z>|HzF|IYUNd$wP3&71o^_SO|MUw7x3gMVq9+4tJdJ-_Acqo2R#WlzQ9SG=uj&bKGR58i z#rnHDX0`rf$J(D9llt{NKltI5Ut0P0Kb|<_?LWQxsjWXu+;zjx_h0$;{bv62uiIxn zc;0(%`^VrG?@qh2r9C}48bkIc~ym+0cS3_qlUfz1gqP6eR z_45Mp75?c<#kH)T8^xdeG+O`4?`DMd68}Y3&a~=v{dLhm*83rGpp-qnlq>w@-G3G6 zVCS~b#Q11vV&_)pUsik{lrG6r<~zQn@ZV1HJ(#MAMdrQ3%u|-%{wH*imHM!KmmTw` z51Fqlk6B)c#r|jMMCPmckT}4SO^a(Gr&3-lecQ?`^UI_{6Wgx~O^l6%Cbk)WW8(Ym z;`fZiCa_q~hr}fR#CMfqu$NorYvnl{nn))@6I=D4yiV)ya@XQsVv{&6EFy27)pB(p zv7+;gkh4wZq5q`pF@a~hked-@%WPGlyqDk0->tYJwBkw};(MvTa&%zVyG%#kQol04 zonu1IxcJK!_!Hmn+%ED;D_mfL8wdN=cza>ZYv{H=Ut-V&q4YEN5@Ybmo-{(=`v?=ns`@+%}` zTwy3!{*3rd{>eCn(pKX;DSN!3p#CK$OFu#8FE}VvcD@TVf62cn8+jE9E!_uIeoObI z^Ou+cd-h#)Z`VgvpT9EnZqGZX1DVe6GcRRGdv@X7%s+?0PyV{xUh=l%v2;+0F34Ae zb~%2ob9PY-hb>Ry`pK_UTFXAPEs>X3j!WgU`?uQk%jLL0gBS;3-sxU(Eyo4;$lvAY zE%Q}JifjAt#48rcxWAuO?AP+YXZ=I!^WN4!bj136Ein*7Gm}0Cl%a?s^K!u1z4&30 zR(F4~TLZf_P^ku}ibT74nLTYruYZUhtJXgdCiOm+ny-IYqSrs@(2iAJXZzJYRoU)@ z#rg;E7F+*7`CRJRQ0l$`YyE?n-|qYWzcp~s>;(%Kh8DN9hF&86!Y%ctjm9hYD!Kka zmZz5MAEruwvc3@0TOsNL);}Dq9k;~K#;o;UGTve0JMJZ3S$CGR{$cOFw)4eWseNB2 z|7QI7SO5K@Nc(*`gBxA?^qNogU$J1$TTZ)q#=%#Ap>^)-t{0z=T;KNU`FGzv|L&Ka zfBuck)35Bom2@3tR5d31R1k1pr@EeP+djH<93mvrSz_X9I=4D%s3B7sQ zA%8ydviJP(eZL5e9GiXr;?=ibyd<=K@f|O$zV3U6UhukT=uZ#5aO%B3-DmXnP4^%E z$z%4t@WL3hBUmp{D!x4+ou7mo~oZuFk<_OTVW-*d#$Z+_ro|NC^yWqZE)vB!@JHC?dv)t{ez zQp=KMbN=>$C;xim#FEwvUYvQ@$shmSja&cJ{K4B_`F{g@{rK)DlCKH<{MIMids~0p zJ$C!$AGzv|Hy_#i?azPf`QyJjYsWLQ{{7+?voE{$9o--K`GH>;d*c2l4_$fd&wsUU zEKaw+Z&nV1h_SJt{(_bt6z<(} zgL@|2bSs`2F+N%OpPO8_-@W8nD2-b_g?=w2$M1KA@+tIP!F+aBuKz-E3gu`2&XH#4 z&WUVaav~dQ5Px!vx=ai*?t-?0@$GpPx_0Ct<=Fqq$$xvsnMUF_(iO^=?;LU4Rybu1 zk4%!~h%fVz<+fv%*U4c=I`S$MPLgMrH7D$lGbygj-yWZ9ujQBNWS+>8A+pBBvynp4ag3rhxYGn`PpTZlcyQSp5D5a_MP4))>#RgwC5vrGrCp$8Q^s#M|e2pO!5&C;Jj6LWKT`eTvK#*x>A*mMx~c-QVxl zz-|qcrva)W(FQr@WYbAC$Jw+>&B+o*_1Va^o|A1jOU=m=nxzXHd(y#MY)+Q)x!1F5 zPIhJN;`pU4gZ*8NE6uEHazEAi*QAhjlnHaPbBEv6GI#iWbvGxw;L#&X&dDwjT-0(- zHg&+5wI_Y#akVFXpHOX1e2{*uoRg(KU{3Z?xu;xw!m0e6>|^3P?&WXg&dKiHlfHXT zdg(psawmF3Y(-};_o)k;n}HqVh`Y zN!Mu?7ESAWPx_v(nQ@yq!C|@Dlm4eQ#}59odCnW2diwsOn~uBbd;2}IVSL`T@zD+Y z?zi7DhhF&obMHCu*yiSrqfR(+@WxM_f5vA&b^GZ2A1}ZA=E%i=dT}_ucJnzsulm(H zpa1JwpL>1Ff9?HL*BOz47tY!7_^bMcHoa#52d;bPE!Y0)x{v&kcv&8#%6F_RUvihIh2TtK<0I;}1P%@q(dWe)$zI z|NU3)IOd^MmmIeA+6#XA=pldp!%t6q&2dM)W#gf5jJ0%MddAg{o%YJiDeX@mbnD$8 z+p*#QBL8Ul>mA*5zkl~hU%KX+eV;gRXG`#%nmw&aUfUeUD2e=fiL*rnS( z)b^pZ>C2l=J>r#Djz75X?@oX7j=g?6XU5i_&3@+aOFlp6*r(ESAAN7@%U}BOKi;zM zIY(S~_uQG0S=S$T^a*=E`1Y4S`|D>{FFNh>S1!NuzwcUe#BHBkxcJ%sJMN#WU-!<| zn~vW9FNc5jLo3^Uv*+4RKmFlHe)pZdZ}`K`)r&?tUa{lWf6r}ytpC{;Z)rI4z9Y8w z-*t5C>#zO6&V#xa?d-kbHCGIs*!SPZ%y`r9wtjr%kDJzB5c>D_pAGN-j`z*!?SA4F z`#$%VgJ1vF883gyog@E#@!UOUTsivUx>t->YYFTeCEb| zN6(-8)F+Pl!~@%J{^LaVWk0&-a|h1+`ai$2|M3?-vTonm4ZmNp_PkFw9sKgQ-PV4= zK=kz|4tIV3=$CZdvd{DTe6aW3hrMI=msj83_R?=Ye$&8XM_zts`<{DlfBVqBZQFkI zp56;SbJ9`wzHH|g7VYuV9}F%zG-Ev-J3qJ_vf#>yz}*Auln(QkN@rCYnl%~@1|ehvbbTd4?X(T!|rLC@$^b=%tTd`|)Q!z5e*i?|9qqt~CJncdh2ngf91#* zKlb#sp;@8i$4}kyFTF5Z-+?L5sthg>a(RSU=iLKj9&j(6;V>_}F(UgckvU6g~n3#ttFb`3z z9A@0icy^+xZ+v3T+8q<&#P~#`_$!u{?<2!IC+3KFGQLb#2m^7=(9A!vB|8xoG8zSj z@QSgCIc?jla+&G4PmX3M8rnp>6={K0VU~Et3#>;V4WXI$4qbMc_nfx0v{LJDPGpNn zQh40DDY0F|X|m!qL{bX3(1Ya7lyAx~f0uewI^Qu73a`!OFL4ZS-B}QWGv1tuaCEyR zqfh9?l<$_m)TPWn932yR&vE3xA~`lG|B=z1jyMwMoCRAZ!a{%YSv2#P_h2aWo5j6+ zh8B!YlH0UmG6!o%r0yk0d8`dh!`3s~oZLCFvxFTK%3s=?^$ZKXrQC3HVj?X#i6*yB zgd@W_?3AIcFFnz;AZf*EOQT;p%)n^ zEI6}pi|40V*xrtv-tw1iskEK2ZcC)hLb&bUNv^GWQ$D+*?UFp2<+8^&ug$pWOm;%H zVX_=jk7oQr_Y#AwbFNEI&Rfbal*ay@i9yz#JB1GIaony8wYlZwja)khzN<8>hKx${ z^cr8R4;M)b+m-y@?RR_H#&Ec#tgu)oXOAzho5cDvS$8amL>#|0H#b|~H-;M>-<#>} z_hGTlNz7AEM4Fwlq->do`8{bH8X818<4=D_oN_~%zmg|HOQs6vh_zXzWJujejHH<( z@-G#?)Nl6urOZNlFO`1xZ^i9lw{EJV8`hLCmse~}33Gr`y{07lLmz8O=2v%3$s8tf zg>e`Al$z^QaCWaLDW<#K-|yDIZVi;D0jeU=E?#C&k9on(V>xh0IwQQH$-0NAjrsS;dzTSS{?`k$tmw!Li`InFM|Bslg zDH#dSi9deTX!oZOm!x4=m!wzjq`Zf!lOd4B6j zOHL}arbMUBzgxgeTj81#C9h=(>p~Wp@=B~J(O8;`ruDt1r0bjqMC(5D)2t~uLar$} z(`QM#4J+c4S|B{~5*YMb~-V={#eaC|j zob}hAKKJia&pQ2w>!QcJe(B!fD?Z&c{F{dk*yq;kKlI#L;fLOG*7@%|=l;&~dU`Iu z@qhmOu|58y>DEJUyz$)c{nv5n@v(=F+_>zCgYNm@TaLM6|JVNIiMh{g{^^XTUi|j# z2ipgK`9EW~9&lm9g$*zMWA?}AzI5^R2RyLiW8dny;hc?gW?!-RJ72i@4~HIhMC(-t zKXg~e1+Vz@-!^w282iTKEjNAky7<8#j_;{RjsI^dc}x_AT&*25k> zOU{ZN6g9R_P{epDqN2ujf{KO{g+tKTv17;6JMnDT(X(K^*s+{qIeUp6J9joLcVf-A zlifcFLqf_X5j6N)-_B;|y*KYa)nk82C z9e?`u-vt^@et5E1y&XIDd9-SLbHT`6*Mc^6J?(R7kJrho>(A$1IrYSp>5}|MQdagF zxa;v@WxM6))Smd7V>*FE$?kbX?$1PbNIr)h01+@Sp7m z-Kw1TNvFuC{T$|ZYQ3zlWL}R)IU;@xxNxcP=G$j3Ip;WCy8obsYu~tbesgJD^BcS0 z$u}LZy(wb)wfUEN#(MlM$ysGy-k&P^zJF9@ymVl}+l2~6_o>?B-rg;>*4-@7?2Xgt zb6#^RwovZNb)s_0+r#y9d|J0JS0&N!hu=(oy#MNJ(Rh!G9TSvpjmAys(la$|RQr)_ zrp|r4^GKJOITe4tocj1|mqq99gr0p`#;MZ8W4#NVT99~e-HEZq6FuXdn+@Jt>z@({ zifC@dL$Z;AWD5Qmqq9`~%9% zzbWer+InmA(7vA8xpp4>~SLL<3H?iBK9~DIn#Bd zUnj`UaUzk-eikvzJ|3aWei0tb-V)4Hi%Q6>but69&O=w6h`xKtb;6Gvgg2296&0nH zN86C3$?v|*9v=GS6CS$qk!$2PS`Wg9$R<3ATzz@%*VET$yFKjo_?qf~p*RrIj~HtY zLvbRyWZC0H*!E_vI1x7P#Qc~OW3jj2m%aK;#A#rCOmCb9x32cN<22;Uc*JScvuvD3 zVJwa^PM5yF%+?QCb?k8(`fO*vZnuEl0>)VYT@f?>rjOI$zQ+(#gN@SwbvgBU;xwYT zaRihuos^3!L7WEk)f=b5mCtZLYyTbtZEJg4AQ0vB_Vn`a)6&boHgnX?c6)yqiqjw% z>x$F((y&j9)8P68#A*D@tOk=m;pzP9@0OGM<}=rjCcoL^G?*De@>hWg1qkaupm8TJ zZ;^a(@Q|U6nN+h1vheWG#&zlpA3of^_ebV?f4J4F-@vtnr#lnh(9q4TmDsbPR|9dq zx~{D}-5WJ>Yvh_)oCcS-zTUhh#%XZ;NZf}WU518t3LMb5e@MTG!GS}<+jupr!0atj zyMIvs#$4Wddh_y*($O=f8H0 z|2aBEw#Rqf&Txm`cVCTnXzbw?5qR_BpOtf0aBS68B#6!3UT|vrr+3k^WQDR;rq?u&D;pY+?thzjBDqrN?rv|TA!xxV_a32%1(S@Kxi3%mYv+4GZQUylM&Iow3Kk3_sA$^qxa|OPdp;!PHFGqDBN4RA6NB9bujgqwQCw-uO?k0Q9-B=SZ^*d(d9Xak` z-&J;I)|YUQ>XNy===YmR8vF>=m!JGbsv|j=Q7OZL-`FavTL;{uD?hoWPY>iH?B6h{D8Jh?Q?y5Mi3sv*R$^#VVydpje-3hFMX{T*Tf{Bp6k$?r#|#R8CPNRwYl-#N|Kr**-6rSmbT1=~oxIx$p44kxnb z!_bibW-{dp5A^@7^sMiR-m$Sg%!!77gpSYM5Cp0GC&@ zc2DOuF&2R3SD)hPdWX}fOd3nbIOuCr5oN0N9Tr5DhW}BE;fGQn2{MfpI zuu+TF-m?$72^%?7tavO*SY~C#n~e|6pIW0-qoY$+J?*@pLaWI~K7DBPqQj3HcATra zY+3T*GYb+HL^jOPZ|296S68~<_n)yh?{}e-Cbv=tGl}; z`abD1>t@q4g-q4Gc^~em->1NlJ9GCH zN}c3ZVB(TBL1j~B4eHXR`}&s0#It|z)v;KiqyLT^bLwE}#ElJJ)iseh?szS{(U%(|Sr+`<2K zKO1rLT_I`T5|UOq3!cB`(JW=79ipo==*i0_3=nfX7;1(lXLJQ_vy=z-?ZhC_r;;Vwq3P(ARnRHwnBUhEn7P;%Aw6eyBy#_bkMe+HV^H* z2zj!@f)3o zPUF7Js5yCPex~vO{)E!JERhEP%y{7*(9G^N<~Q&GH6{soonaOcaN#pjg?LKnsTqHdf4yJ9&7Y=oQ%UMEtY{>L(&(^fHkPk9m^nlXI?DB z;E18&0sUlw=0-E<+LF2`nLsh{r)P~VojUet1_MU4|7^E_-2$0f09_F??v2yFF_qgV zK-P(kWdM~P|4gwAZd@z_N40e&=c(c8V;P{YzE}p7&zOFemSs=dEnv4m_Ot-{J7|ws z2J{DrWvIgKYaj_``#*A@3v&%=lArLh$1*UpfA)P1{6a#4n^o}aAJR8aM+(6{gEoeypkl~rfGI%y<;NGZiqn1nzKm)R`f!M2V-Bt}-c)7N0>DIEYd%etJ z8MwS&dh?nX%fRvT)XOiE?@w@fTj{ zz;YE_^PTxAHlemdy`*Y6zDbFWteP@%%(`kxd7o@b$R}I4?|QBH$Ty>Aj~l-)SL`1i z6Q{l&Un1rDK!5l5Q#}TSmAkTkOTzQo-9Ih9d~Hp{PxBIn%}OrjFW6h9c}I7@zdDj0 zBI9=l;6E8!pO=Q4wmz?YKk1k3^BC#pF^Ea%!&Ww;#@u6$Y?8+q z-lp7Rsvf5BHsxMp^)Q8}srMSAgQ+}Cz2A@yrt&lAetkNa!^_+}x^ys?mpS=p`R4H8 zn@3v*zP!xI5BcWgwL~5w-x7SjR32EL$GV8#^?7bR<#VskOXr!lK0h?5e_-E;upyRQ zpD#vF5;K*J{?oH=lujM{`aEqld)jURy9G?K0J*`#;nA zycf4V&r!OJ(&6dX=b^8@^?8)fn0|Hy6J*snU|682Wk~3V&$Qvd=ax^~`)f~Y_8RET z>^1OHw%cnUSy?61y#@jqfNlBRfz&GOUIWqx*lVDlO{y5y=g}WveZD=juK@W=yr9`@ zz?Zp(H2KZGKF_SplRx|VJkRy{M)e!HxwdRX-tSkh&wDca1+?(;Zsb|7ZYwWWuU46@ z&$D?w$@~4f^P0Fm&*_r3-k(ty{d)~?d0Xk#h4=b=-=0zHn3i`Cdkxg;kkie1aNZS) zUuu+`>NUaZWl`Up)9zP|JzKS-q>|?fpIgTxM00D@IQC0WOpDD8FAQrluV}A%Ypy&Q za(hw3@=Gq9ZnWd%PqD+A7V24U*xDWS6g?Ju{J!FLv(r@{g}<9MwJ)GQ?zfrk~34r#JM}jNOk~@fhyGc1p!HQ>zoe!2yUhRoO6rz8pPWAw%B32{_B%KuW>+Lq0`z*zFg)BIobz z3QU?&_4+r9E6Ps^2V7MBT%<^9hXTEv6_tN4STuOG=-$%qowg~X1)U}Ba`~VB=j^1K z^)7GgE|~WG$MNHdPEr=3v@n8YS1QWkVS!N5oJU?r>$O_JQk!61^;?i-h5onOtohh)s~TgdT(+ z;RBwaAQ}6gc2RdeWqYS?k9O^{si014(7lKIn7L2;$V@JNi{@ky*^$f`jgWz0e30|)K$ zi<#>#%wa5FWA7uf$)Rlneey~9iB87yHs(HsQ~J8-&+yllPs&Z?lCl#@(#G&L<(^Q6 zr<^%t%mMk(fuv30^|joKI0mdA>5XIH)}20g9D`(*$#D#U;Q_(shA#;4r)!^q;#fSy zO**Ld`dXSIgVksD@C6GAt0T1Rf`^|(EOU6!O5_v-<-G>SU`HPSv$N8IMKL`W`W|NgzS<8J3 zYc0ChwaDZedmJ2cJCK91MLv%hOX?064H zN5>qFIdbG^cIMfr^_y-qo454Tu_`s@wB8ziVEsRfJ4al)z3}R|)K9l(_p0|`*WXR| z$LvVD6*p(d%iEF}idT=yU0qhM>5MZw!W+IBcIxQKgfbI9hR!%#s#V9BGKD{mY(6I} z_czD3%z5=>Rdd;$+aC)%MZ2B39p5JZZ1JeX5bqPQ1MiJ`98_b`rK+b_HaU2++x@Px zny24x>?2;)t@WGRswqE*ghhUPa&27x-(OaU{B6aB;qQu{o32{g(KTQ3y6(GO3 z_fv!a6}{JQy5ie;EAy2pQqG}%(C7i%3$GnrD{%jb96e;cuk5@zq_{(q;R7F^Ub1;r z`6hD)9O>EdUDV;Q-@YwB_vzoNy~;AJb0-gMeR|XT`JVNr4>;o2BJaVoiX|5wp6vCa z+nNu@9wo0j{_DxrH*ap-xUOxDHK*P^_CFa^_~@H%GoKGGU3FW~`R0XASNk-t!vES_ zt~+Pgyy8tAtGdr$RJXPFukU8v>QM2_BjMAx&Vs(LPi>u9aA$u*SpT^JJ-%kcJYnhaJI<6=t4<;q5THUT2jB{ndT86YCDvk zd28eI;Fe8G%$(b2^Uhm0dye^ITbXZabUjdR+>SSo-grgIT&mZc5Uc3EZFupGQL!tU zUi+m_si!M*Nn;NuJfAyocgq`lKbHB|vs=@%iij@PKD}>JqlDW#_d;DuIJxB2-8XI9%a`ZbcUbji=-A{bN2l#QfAN>cQ4_s) zd&O2?vB{%((=xU4Y-oI~U)0?x^{dq=yXRTMYboF6lO@zD`(KxP`T7hVUo`Z2kNy1u zLdLya`|TL-*Q;LE{qX4H?d8XB^(eEV)PtzQcWV7z!>djC)ovqJ#DzV^u?Q z&AIr$Qq2bz=(x=@`pnsvGXrw@r0fW3xM5|%?}`m}@|y8t)U|wNr*?ktxh6Hzp|trd*^YvXFA@hvt(jX#{=D;Kb`tTIDXpyb|n{%z0x?m*|LZxB|jBz*mLI2BY$82 z_uAG9+lo}5f1>)S?wj*1ebB&T#+we^zV$sC5ZU8i@!!7Nzj|^1Vf+6#=un@mV5dlZ0m#Hwn#%~O)OoaR?$4Z-{nzEs5dOvxRb4X_DpW_=ZwlDCWz)&e&^^@ zLvi5h{7tzgyjr)eW!*RdINKjgRj= zzwb9}XryRojjqD&TPlC}<6X;>Dc_zMdPa><&B-zc{gWQpm0iHES%B zZl2lW+>UL7#(h_M^3$>J7S&1`xNw`iOm)XP7r)u`sMnPm4|`qtUUs>lSH7uEV{+YY zS8eD`<@C6G|2WQgmiph#{@t2hE%M;MHm^$TT;XzZ%g&q!ul5ZnUTELhwO$D)tF@MU zmT@_^Z9vDX72S)s2q_fj_RMGTu^ij~$ot&q-uadP+gN&FwQEnmpLz6}SI#xh&P^|V z=x!L8s3YE*hT|d28C$Fh9 zTg5GNu28OzeC)2!F@d9>wb@(!^{W0$^AFnSF(H4&kKPAwRhx29+-}$El|wq--BqaU z`0gXi*7I$saGHL`wLz+9c)kvC^0H_B!t3n)v1MYVKg*OI>^&*|Y{H?-{jx`}OroL7wac5za!U)DF;-zg$+mgB;QGoPhCJ9p(s$xoZ$_WrAWvy=tnBIr!rR;8z2DCDtX{lTf%TKGtn%s7cHhjga{m&gjt}j2Us+Lp z{?&?s{Wm;nmo)fMnWOa@bv?W6!m=hUN_jRB)OH`REhy3BRCHKi$KWx~TC6+cc&=kb z*DH0NKWX>=^b+UE^JXt{?7Lu%-?3H4AJ=`RTv}nLu;I@`qFP^k($w#l2S*c~N^B1} z^uG7K*{^S=Yz!-UNYY*8G55*3TH%*l_lf4&h_Y5wOB-$FAyf~LmZ_i6IK zp08yG4s>`mZ~E~bEsCc8+n{*0UITB}@%=;jw*Q{L3f&2Q>Uv_Sa=_!zg3c2c^qSv2 zXkaJ5JPoT9&VA_d!hdpH3cMB?wP=cRn(wFi1B(_{PDWdjxwW z;P9YN{L<0WE(Fb+*J^8-!biH7nh^If!DD;wLmM5QzF60)b!}OR$AM#4_h{`AS>cxs z`{zyXRdaFmy8AyC>+o-6=SvfFN8kPTK*fRHtx~rBwfrw-kNka)4BvI8;&0Qx`>WWc ziiZo=nl-M4VBfX2)z1DdX+2H)?Vuum=IgS!|1UllSGC--+P~=Cz1#BqJ8Y(?*x4o{ zC;87>Ic(*0#l=+b9Q6b1?_B<3+U)OwOV2HIWB8V#A*}+PW|zHOx}C%Q8{xtejoQRU z?w%4lvdXi3M=Dk*oxAG~m%ne<@O+uoYkbPy-+p$MWWmg*59+!*o~WPPsd3ll-Nr5* z)pp6sQNPWPI4LbNtZCT_qBbWVHq0|_;my^u_2=gmUVdVo@Xm0j#uInF>D#SA&tHc2 zc@R2YG%~zbV8#1gdaT-TML6=|=AGLIls^*EsYBA(r|zEP&&Il3TGaUHtoD()4|nhR zpG(htRm&vQ3(WcVl)DSPU%hcYIAqSRo8L^zU8c};k6A5Z+I5&UBqH*^LCq$eo84~p z>ggq>ZV(;cKd#8_(W;Gg`d6OQr&_PqJp_xn2ohI|GZn zkk0k3lHz-J=-b4K^M?({_xn(B%BJw{Z@=+vKRtN-m`%m1^-%0?xq88>zztLKxwkIr z9UZs*pO8_pertzMT<>#y;L_r~mQ^_9Q#i*Y)e(;9PMcCL-3{&(8D#A;dfvVSh0R=-=y3 ze6;)iCf-q>QoCIJJ!H~Fr^X|9tX=%W?{U%R*Z$*q;%V{T)jL(+?B4&)-uS5Y7i8Ce ze_!)-vpUH|JN7Qx@lL|??ya@X*|>&kue z{8lIbEtR`Ao9E>hk(~dhRQFs%I-H;UqhMUKr-AElT|ZfBZtnU?pFZ6h_I}K&#&x=P z7TgT| z)vfu%q$A4*jT<_@YqFoD(5nF}Jo7#OP(pcIuxsVH@1C}a+8TE$X!Akwj#~v2kMG?$ zw$YVAN5^e(e0ciwn1g2uk6&Hw#ND4-j$A*Y`}&e=mac5p{`d*s*&+|G`u|K*+j(#VO_+NUzVx8BeKGR1|Z(FDJg~iM2zI*VoPK$&=jzO>P z%g(mw>{j8C?CL*!9@NfpfdRxO6#JDYs|J)w?HL_;ZQJsBRH+D{X(VXm*Hq!rB3^ zDwXhcO8xP#P5F=ems}lJ0xLJ7GnbU71yh6ik``8o zm_p3?7>X$r`3w)IpATzJVA5Kmx@=X~hfs;zed`n6w6siwr zXL8L1K1SZ_?BuKxIg3;xp-AN`k*Ykz9x91gq6+o(SIK=tRgtntm5e!;N!fFM59S_M zSCxy4P_3s)Wz*8hnJJ^Ii-?gWRz*j~s1ypND&cI3N|BJPie-+d_#{n@mG2H%2X1yt>r42#8)L@Y)tIp&ytcMxia6?ij?{?dNbFUb64g!V((C)& zZKh;w7$2)piJ5ze9Bmtjofw=MInK^PrmhkDGqxvnNa(^`b5_?QsV{SlsSmECzBAWE z#9mAt^Y@jgd6KlcT`)HG5WA|PqoY;vaSD}^(SgV&hax^frHD&l@~5wxzD(NJRie&M z>bsD!yO5!1XC91hF&>O<84Tqj1{X#a!I88#SCKPw2pL_OddA^PY%FyZGi`&hgCd?e zV%Q@gp0Ss|%1PZ;HFeU3kss?DrHb>FtK#Lcs<`;G%y-L_s(4wfDn2wyrC_j)c9E!J zrE*oM%%3@A>N-vI^AIz-GWxhMIuN@OJp>G%#J+@YWT=F(yId6$?a!1^r0zF}enKa5 zp9Y6Wrmn~NM>9G^sp6yK8T-XCZAhk4M8-3EFy&`-^I&+38C-lBn-iIY4{0ytAiRh^ zLQ-~LrrwI3RZ@wIDke&zii?&qc?iC2za{hVO(z?9qnLWFi1cU59I28pb&v3ilt!we z85=}0b;^~&Ma_e`E>hPGrp#PfQ5Mz)#4bXnP57#!A|)!hjHx3`n*1hXzCV>&Kk4rw zQAIOtE$NOvUswqwfPeJxd_>|qJ7=;LwQRaI+1pYp$e(u8U?%uxGSez-|G% z1v0llOh8R_Y)o=rma6Y&obOx$_9Gp1Orbt*iHF#j!eX_m_fltNvg_{7BAW{Y=v+Fz-|G% z1?(2ETflAsy9MkPuv;LzTLAOmn19ea56;b7e6D$LqNkKGHs*mUG3R9dLNZWmK8Q(o z4h{(yxiKd^{~!p|Qpdiz1>ag> z&u_PY-2%h{=!)odD0vvWSA>fvySGIe-S?UHw&1??6va^*Jtemn2k}RQIRygft9Ne; zu6&vGvqXmUF}t?~Ezh3*x-B5e>Fw#|->0RQe_`e*o$dCv5KYRH={GtEy0-jA$LFd| zq`zR|WCiH&u(w5=BdbwVz42*#Taar=lV3^Ssbg;o5p&tYDL3=~sM!&l7@})$3&$Sp z-WE@#-)*hn=Dg%;>G56_=1OKK6c#)DTv0SvQmM5Elde=`npcINf`3^5!}_&Vk5_to zvg^~!?TY96uB(O zbAkf~{23Q8Kk-4>Tgld0PkJx$c8EQ*!zb~1{Nd6~*Ochx@tb?FyY~#i_!OU%`D5A_ zcZ*z9V0*6~m571>d(M8gAPX7{_AQmw+yi~Zdj72R3z{n5B5kL>}eyF;({Qkxld^_y$D=0`Ew&yR0 zKXUpj8(tlKb$Q=IeJ$BhDr~>g3b$)}Dz=^ZAyiy!bz@1wV!tK_qGjXf_UyZ&&gG9ut}ka@i@xz+-fpvV zD=W+|dFp?yj_jQOA-D6Z>$`t@TjIp98h^jqKT}#ZWoFm+RZEn+TxQO(<~>GlDmbF= zFXzAa-@EAK{ce$EbKJNxdh)-6{abtd;1l@%??K_WfB5y&0kg1rskD#S*jQC$ zWTegXNK8y*-f=vuK9ou&^S&Q@C=?2t=#ZS8tRe@|fz(4%ez{z36WOGN5&Vh0$q^M5 zr9Q|x(LpMeT3rudk9Md{$#2$fmk9|8DjcLPXdkE-i=DJktBbs;4sMSY~E zrmApQOFn7$y=*KP--?vuU{^-;TzvZM`&3{w9g z2lZVaC2fP)#Zo%Jw!{vEw?4Vr*U5dBlCN!loNMC%yIV>g%_p-m6I`s_{z>_?ZA+h% zdPwVR$uwR6h&^yX7t%&8DN~yl@iTz8Hbq^)7^I!Y*5}r)1GX-YE#;AUMdmdh0oEn- z#;0)W8J{aY1?%H+Tg+J>cjLP}F3`0;E;M2SMd!K=tB!qn+?EyHF3WC#FW3U;is<$6 zm=Wyycw9ereH>JB;xny}*X7>R()(s$JASNHTc=S zRk{B6>fFM1=iPT*zkYqss5Y%v-ab>uQPsq;r0VC$e@BjCmLRWI{!cl!Si*%1orgs| zefe_hPbY>7URD&8D_{Qi*?9%;58PfjVd~VWN4GRyS6215wjgxV&iM~ZN7ktq->dev zdx!5hKioBES{=7|Y0cT8?Yhj%F?{{{fyGmA7yTMr{*6OQ(>JX)tr!|mBz8iaLuBgruUqe87S}i4xj&{)jub_{Sg&z^?dm$| z!bX8$=e0aOg>Mh}BY(v!g(Q!{PmTG>vr~`bBma6l;mFG2C+-wm6VBoQu=c32|mMV*CRI`4WI*odb z8#;8}TK|w5Rod^k^XkQmb3F==IPO+odAQn&|Asg<;NSjwM50HZ=a1GO9e>WXLWde_+cmj*&uzZy zzyBJH95*gx{o3k>q6VBVpCh4>_{GcnJCu%P#*P~?;`qZRf*=3g+`jd7w=?s?wyt`2 zuAiTygXi}>1mQQ=o~!4uabTBbuQs)Bv$AV^({G$x74$k$b>r?s9i!L3OkDoMjO32L zE(y4Q^USLaw|{DP$J1}=Zb|dSj!{b^dsg$k_9150v4Ry#yX?uC(B$sNk7F7XcJTe@ z;@l2RpUSSiSTRao=+gMVI$v^4a+F-?_}iPP(kBM4y|8BG-*;0EKL6op!N^YCYHXSC z`0CTWBhH+pK_+JeoN{c!cc-fa#p33pfc4LvqvZZ;s7^y#x`^SPP+5dzt| z3Ch;dCvLT_7g6Y5a(}_{73cTf8yW6B_Cv$o_18YG?Q>qxEy1PEEQf88Q@V$3$XWi* zx;oo`h%Q+w<>iH{rHhw5?HJv#ZrAC3%uPH^c`Ji zQr%t~yVh!7B1c@k`(@mJkMl2fvPRu|jk?uYT=?%qS2#2N<{uOVBX3Z6`CJQecr64Fg0h&_7y)B{ioht(rvYA z<>R%fh5rO~pXR|_fKO*AW+1hwX)y!Z_ruR53S{*^GH3odbtH4)WbXcR=s@;agnTkD zFCzPxGJ9N-H3G7JfHebhZjE(SB8$i%Yj$KloUE5%9f!2iO|*0CkVlKW&UGQGUXM$RRdG*@+&c{Nx(sk!#S8v<-rbrR0-xp$-zc z&;xaV%-f?LXs>fvNzXu?3M&D5-~}>?BQa zAk)sCh~|rq%M#&`Q6fMDHwBr0g*xE5_!;p$VXpj$@)jiPxklKWdmYo zqKmc;q+M95|0S~VN7@1DTXflg*1;M+3+f>$AF(}T!Uo!DQXinVB`N9aFdh(j@4_!!KL)sZ|AU44GL;7RfXH81#A?Xi*11UGrfy5hF zQ?52|Vgukn>K=5^zQTo6s+>$#7HXMdQWX{r>iWD zIh&pu$;RZ{NWDyA?2B@ZV9trTm8015>0{{BDX)5MfLOS7SV%-@n<1eQW^C!L&MPuA zGozd%qir6wlB#c@>%GsBI#n;&08o4yoa*e?{ z_)57wtu-2Ftux>YJq_WTh9_4KGh#YD3;kIKUu6UvyJI0GEzSn` zLQg~Z0#CGGj9b8+R*=Ql{LP%aXohB|t%I*(c=o^-dK$tPcmiLT8@MA4+NV#TJe>K8 zN}oQs@_DFA<)I#bWzyg@Kad@Ny9R}YM+5|a9<{74m9$^tFT+2EznpxT^_SsC(~1bY zQ2ug>xXSNS^z$`cI(=!3x6sp2e+)ch?HtiJJS?D}*$;o+zN2`!ny4`Id_rBCYyI+I1`=1olCDb$Xro zxYacvID*e~Am98NqgbauR&aaYY2;Yv4D+6*az}p*J*obOaCSiQxgi4SpQf*^r;+Zz(^nJ@Y}@pwQqE zG=F2$8b9u%PCqU#h4oA1M_DR;nVuSw6L*ANUj$|EPdp?LWbViDEf?@Hq@TIJ6Woa( zmu4TX9wi?6y8Sqzjrs{GSFcRP5B&u6r22^rejM<`IDmEl+-dn3=f6}xPHZE5Q+KD2 zOQ7wnFAaR5ry+cSC-4Pd;EpsX@cmN#xYTU24h20ad^7lQ7_Vr2fhSG*`eA(YYxJ>> zAE)5<2++vMT4!j#&@%(RoVw&b;>W?S(C5d&F9Sutjd}q;f$$@K9Q-!;aj*{ZBMoXP zKhCp%f3P%*I_AK9+y|Y0ob(Fomn5HNsq992YDlPTKieOJviD1vn4--6IKJgFq!-`c z3GT#?gMH9XDE|G*{Wu%V*C@DpWh##7Cxk}M*8or8i*^9qY55rEzf?a?X(K-_?leC? z4ti4KKn6b@cmiMG3EYte1-@UbA7>+cVNX*j+HWeSCxveYKMvy+jjukreEl%K`89f3 z$Bz?d6F(h#X26#-5UB^mkAq*K&yRy&28w+Glhy37&aTRi)ANU~-56`(YKja5L z^y82NK52MhUXb%MX@1BLeu#^J9Owsrh$BP)P4h#3@I!lp9Pq(9I_e4HA+-4s{}1mm zpnnnG%H03UI`QNl0&A@22(!t04)mn^7doCCcmm(3cotvaj`{hjbgfI7PI+Qo7 zQTPW!PESMl0#D$J_mO}*UB0XnPi`H2#n}X3=xGRF;0b(zCvZm^H0#8ZTL)ihHkrqR zo`&$ndxJE-z>}s~Cq9*pC%5$bT*{wp6E8#C)z~!pXXvR9U%Zzqm$7k;X1|wf(%ZP2 zQk2u2rk#~${5@0uH1U>}eJ@w`BWst$*X*9XiI>^=lH`l&=S_;4sIa)~UG;mpF-=%1 zslZZMUzVE4&gk1oy&&`GC>Q3@6UVUS)W;~hzL%T4jrAj?Rn4{Qm-SvQ?16qH$-HhF1WOLH4$#XLB z1irF2EWW^&BPId%2|jw#>Tt3T+gZ zPTSSkH2g5=X$W87349aZvG@XaS}xz`D0Tbw%DVWbW|Msrpr;{xfhX{d*}>uq+;!t? z_G^9uZv16;&EYi)TWOsno3vjsr>DN>D2%_r6ZlG+v3@6T*Nv~6*~oC?ZVa-uOg~Z%c01E3<0}(aJjQHzu33U+8HFU*HLR@!Sa9_26r^ zgT;-%S+@NuvkAV?(-6ME6Zis8;EptCR(cPc>`V2vzK4zZDa=Xuy}XF9z(x&3hz%pShj5bq6U|R| zJYOZYkv}CllYV~NSPS5J7kV0e9^&vse~fm3c0tPpzUDp=rN@``t7sXhwOzu86h351@8##`VCd?80)JI+eu?bp2T3C359w`uENde(_to#=f})H_N6 zZlkGrxist@opNyB2iCpsiQJ7HKZLben(UaKf|ERfUGGC0RDPZ97eSe?7JgCVE$oB# zs&vnMyk+Mf&3`cUgkgD7YmK)G8}-LnS2ooQ7;mAcq45@Y0^h_sEWW^qFe&26kpsYvCIcX`47K=}mt4LQg~Z!XKgW)o1vu5@$#7RnJdZ z_<2`8&Nle!v#+7+7=NK>X85Y#d*S>?`n?Fqf!_^^aT)bO`@IMf#|6I}emczuX;6#$ z>9x(@56v;J0YAMR=a-jbsaTwzqCEJX2-2Y9vut|>W&L!+??WShR;5^Hlymk$KM^Bh z?W0fctm3DWbtr4R50g6DHvL30^*t7S_NK3+pMai*=1qVn@QrG~;tSkq{#nIOw-&zQ zv9`fCj^{WJJq_WTh9~EzCv*KAaMz9R=l9dCg|Bp^ZSZwc^7G@Mry+cSC)zLY1nx+K zW)(l(TKI~`+XmlczUvm8o`&#+KSJXRJZYL${B(k^HNI~ow^940?P_cq<1h5g3}51> z!*A5*r^D|C#kh=mq3x#=ewg0_KYBh0>)7!75w8vZpXP`B;D`AK$f5ZmJ{a>rG(Y4A zKRoY34$TkosF-)4`5`~}!Eb^bnjhjHF~33cLw@kXI1M@A2RsmO2V7`=$Pa!P7a)h` zhxjgx&on>e2S4;fkVErBJQ2nNnji9mAJ$_bhvtX)6^uJHKja5Ltp7m{>K)=N@Vtq2 zSehU5gCE)<E+xSDYU5!lxU+8HF zU*HLRG_Vx{(LqvuuHuEwT;ubk7<5Wc_@_$D`E@dfU*T)xjU zTwH9HZNG|aGA|814dDwsfp1)87GL158((vyu$b?KvG0XiAnw^Z`!}R!llBWeGkcyP z<1g?8z6yU9U*N7A->mRnik0vklTF57PESMl0#D$JeFcEK9(=RFdnwkzSDH=yE9hwm zU*HLRfhTZB8k8M>-OP5dxbZj3_RsQc(te?*A$+m_2k4f$8V6ZoQ?0(YcAfv>q9mgVByt+RiUIGgm(&{JRgP1`?-ix)O~|D^Uoa*-K( zC^4>GhQDuhUCeM-`U}?DKgsDd8%G_N%F@&e?E0IMi_d@-`EX(+RhHtOPkOR6s$+U; zBpZ`&BhSrAWIl^47vgRbcj}H8hk)$5f0D2$XV-68it-pwzpVX}U=Q@;ssGE|E}S1` zyt$}5J*l+0No&RDNwdi~4LuEw)4&t>3j4G80(aW}EWTzxMhRNb49!ei3*VS*vaSm~ z4dDwsfp44#i!X4e&ClX%_G6Sq`!icR)X0>hR645zej?N?UJU-joR*^a<%7*g2%%pulkN;E;fDMof4} znC51q&tkGkoE`MUJT&W!L^fv&s@eY;cmm(FcEGg@+A!*M0v=H|eDgyeYmK)tHd<%E zyf(^XEX8;WJ+;PLf-QGw@CBa07jl3*(x7U5%>9TW!-Q{s=wU5<c2x51CYIvetXFQ}#bxb_jj;X$FnBf!^Gs`2A=?~ABt#rh?}HY|1V zNly*QOXc3<1ZD3}JY?v5*nGlDz_kRJy;fiKzt zaHs2!x*z|7{WztK@ReQRH_k&(t#Lr79|t^vFYpBJNQ3hA!}#Wh9@g^X6gC>?ldtl_ z7kV1P7vmL;FYHKDzJ3_r{Lsg0ew>ZkFUnym#dBCHr>7Ra=~%&!gI}S~kAq(Zigt~9 z0Y3qL9Q-!;aS)39NP}9+kMr!`A1uwHjyW(N_d)0Sh`2NBm!wwY{I{U=)R0gK_nkdZ z_I|_r`0yGgH$U{SmLDg!Q9NJ__5D?p%MeBTg`QgD zyiR;wxbcd{SDzfdei+~U(92qWoWe%)=_rS(6!=0o{#2-{Av8S=Tpd``5}%G>jWA2arway&qI&{z2J9Z z-Vy#Q%@6s(5B)BlqoE)8Ar24EzcfGO2S2oP$N`@;JTNcF`AsxGzOx1o05s{K$GN-eW-jlI)kc|Ce>*$=UT-OYeIUW25l{xS2}P zzd%pj{flP34tN4zWd{~t;7-fWI`QPz!B?71{CntW2w&g{eB-$Hk$}5ye6vD4xpnXr zW)uGadK$tPcmiMG3EYte%{uYq*1=biP4>lro`&$ndxJE-z>}s~CqC6W?_G;+^n6a+ z)z~z~U+Ae1U%Zza^Nx*cG~vD6u)u)uK#^adT+}ioB&@%vi>2PnEn~){qP5=3O}xa~ zC2kQ*g`Y4CMApohPy9y?Sq{pJ}>SFOT|~xQxn-4eLJZa>UapQT$o1}C$iw7xdxZTh^SD<1`Lo6^1b6Zr1$&?$mq;_W3*YCcE?q5E ze(UVVE49&js<~D`KMp-Hj}Cq+)i@P%j03*F6Zk5=Vetj-$Op>zIjYUzfPsM`v%`v^ z21Bj0e@09;@x!2}A$)-+@Rb#2@dfT$234Q3_?rJ5A z6MUhkA$)-+@KyfE;tSkqvvT;F?O=751r0F!CC_xqSf~9evkAV?(-6ME6Zl36SbTwd zI+HR94qvl3KIz;qAUKd_YF64h_@-tP{~3B3!Z!_1X0C%wBVyhMxYMTR@HN}P(i(py z0l@=AzCrT9U|NV#Y3txC&L;jd^fZJo@I?ECX@NV^pjl}jg|B&E8_X|bzFByRoo~kc zI`9I`di&Zu(;2rNlZzccBzag0{mrL!TCsV*kojiLK4`Co?8L1b)-^Y@*OGC8*4WoZ zX`^*RdVR{+`iSRU=&5_%kbN#D>j}UU_(Bfa1=65dsXzXj_q9R)i~czE4BH>0p9Wr_ zXCpK0YZDMI!>`8E_GabM@F(v>4^=01?`xCl#P-ADLF{^}a$tI@;iUUa!Nq-oGH;F_ zX799ae{AZ$&bqbNe--OPun*d6YFE}i`f_#+2#( zg%rN6;%0n$q?)lm@=g(-6ME z6ZnEZa7P*x_G6)itb z_r5kUWm&%@u`o+x#OWzrE;=o~&H8bm%#1VR!+kk^9PERB!lmuk?Z>6ssGm^q+@}_L zQvE~*KMr^T-?VnXwF|nwW1Rm|{WzhG_BRvWN&kKpZD)OHjPuab5Wc_@_<}ERM;a9P zn%m)8Zk)Hye4N-u_`;s1Qs4_cDSR{daTu>?eD%rYix1!Y8ojLJ$H}wFd+X3M1HPPr z;K#wQ(C5d&F9XGRje0@*aq!#V$4R1CKMwgd_^@Xd_T$WsGuF(<>HdCGa!1xLku+wh zvR!&gmy1qIm27_us`=fz^Km2w(3*dw9>p?3U?21oGOw@Ok5k&HpOEn!=bP#rknJny*p(#nX@D^fZJo@C3fV6SyM{3Vgp*KTbX|d(78BPYT}* zejLUt8eiZ^Q@(x}-~1YVtmMZ{&L;SBdS<|vGZ6eZ_!av6IQV6t=(kZXXg>~q8~ixM z6>eRXo0rqz!=72rkCTf+28et*_=!dahK0~#45l@H+&i7|$}X;~UlLb=rKzIy)Q|u< zxBdmn%*C~2^JMPFwGZG|u7ZXX?eD%rY>xc2puhGjoew=Vh_P`fKMsBy{5Yp*){jGe4Lun)$8#J*p*AE&g@I3VQtT`=fL^%EKV zIN%9<(GGw+U9B+Af3bdClx_TUr_=oWbRnmwA$)-+@CBa09cfVD`=$DEVjJNLdzwnq z#(CZNX7J-MUeWmKlgrl+BO5 zDY)?#R3Iqf#pbcDA7@A}zQ4ndgMH9XxD3eLk7IU}=OvnNevNSUeN}1e&ARp-F?-{C zxsCj|IG*!0&=dUxSNX{|K$$?eZF*l-xYWQU)T@0BMqv?$6P0lVZt{*^spAbavQC?NqPF|(9;mU7_Vr2 zVMm&(@u4r8kmj2oqOA4(-k5CSr$bLId|?_jg&zmMLa!gk`DIQVMY~45p#3=bZSdoq zo^pO1mp`2nOv1wRaSdqx#-=s%ac^|`aYAp_FL5c(QgQwC)Q}t{*B^s2YpRSNmw4FP z^Kpd@DaP}6_;Iig`Uz?C%>6jN&ue`1Yl>~1eMe$!ogC7SxfiKztaHp#i z#(8t64a_<#_vVNSz>hp1i^y2$F{5aSL{e+^$*X_qCY%~tYQuz6C(39#XGWc=86Zl4P z?Etvb^$6qq=lA2RGv6wt{5ZP&mP*GY^TQW<8p0QN0$=D4+>r(azF(>zmujQ=R@l>2 z3O^2dQut=@)04UJipE!;T)uu7-~1ZAtmDT?ZM1H#DTiriz!!REz?WkOKMsC{K0gkA z87TT~)C<~=gWm=}F77HfAIHth(WS9qd>o(8IS4fIasTS{Z+;Cv)`^dk+Gw0t-sd;YLr?S*T;bK%eDgyOYvCJXqxLI*&JSPcX%JtGSJZqf>_}5JKJ-Ns(tPtnl(pjH6gI*a z#Aa3)-RFdWNA$2^pq|aold;YwpUQrk1KJ++Uu%CXhkfXCiRHCuL}EM9Efqq+>hh? zyv8@b#thb(uaQr+(ff=q_>BY56Mh_Lmkjf9z!UhQ9RPQYJ=rrgK3O6@&N}f^%53sH z4?QV-GtAcjPv8qYfjiQmz}H+?&T{S7O891zabC&kX$W78S2VuBlcs#};hSHhk9Fqb z6xk#`4ti$5mopIjIQSL%{5be!py;v^vr-SXCU}- z@GJEBaq!DP(Ql(((0&~JHu!PUd#oRa{2F}NGYk81<_;TL-&fVWuBs@&`Efm1>eMSe zrOQR9CAT;~j-vv>W}EnN#b`w=oQ59<`=FnQlYZrXoQ=kTxYN}N?eQZG>A1BNv-|K*$8Sv!{l;+2AeuX|i4t^OZ`fbz; z+K+?Z20zZ_ch-+XehohCnT7p0bGsESKkl{8_&8Z1)-O?(U}=;vJ*CSh<1Hw& z=ZH=GxWcp|7EZ&DgMH9X2%W!fKTc?)b=8=c{QNlRN%a#M{5aqVe9;boJ6)|X&VPPC z&PwmA+6Z6TuEwU}$B8*TDSSQX@2&w);0rmx9cfVDYi@^YxpCe)e!4iDjPuZw!Z(AT zj`51d7kJW?FFt(pYxJ>>A1BQw_(IPN_;Ln<9|ylepC1Rm3>5t~>ILn`!Eb{f7Zu6+ zamcU1hdr~fA6Jj&Z){q#uKG%+AD8?s=eJE_smmYfsUbO0w>dwKqpTk%v3h(Q6S`*A zKlpL55BiD3)7iz3v(7j#%_ieK^i1DRL}u{gfG6;c;@Salrz;u8`OojiSttHcVIzFS z&-nT2&@(;08NaUzJb^Fp1nx+K0^cvyk4v@Dx;gA=Dutg8Jt=%M_;DDoXngg_ z&9BkRI)0oyoA`0iGXuVyfztdq&acqt$H6ZHMY~45p#3=bZSdnH4_H4A`8D{kXO?|m z)!bf1pq`H#s8;EvZa*%V^-G+7W~ow!_(=l9p9H>BW$0qY}v>ujDr}=T5eb7%x zf6v^Hd5QdTPDzrt^JO;0b(TKj4lus2U&hyW1@PzN*qj_{#p}=chwY zL-=C6qVWZuH0ArgDc}6i$6D{J3bV=nanMr>UzkQs;m5(R(C5d&F9SupM!lf@IQVVw zbkK_Bi#y7vFyw;hoNwv{9kjQi20_X`pjoY4Qut<=kHdIH?!*55zQR_m&1_F)7PnX;2#w;w0BQ9qH&ci$0CPpY5D;Ku<^j00!~ zz@4uD80XEMlC$JEV2$@xV{C-4g6BTZ(9;mUX?Sw&7kC19q(Oo2m+Hr*&a}re`!ytwZ~Nn$U!$LO{J7NV*#uus&kXo-27(_4ze1lM2fqvy{Wj_a z?Z?4ygC7^Om-XY2UxN>OX4!RBv%}-G_5n`OIUgt9%laiQ=UJ+}ke<@zqSL}F>~l4! zATn>OFKHiO*a!VY%#h6eIKJzmeDiDYvCg_`%naM~6B3@^<$|8*C-kkW0#D$Jb^zQp z_GHiau8Z=`4}Gk)t}2~l8+>DUzK;w&wbo^HuB!r1;0yZ!ccekp_?YX&F--X8haT3# zH^xTeypm^J1oSk7FUBhxU)YhRYJBL6CZzf1hbU{UtIDHo(|%D7Qz`s(=&6NoI#%%G z;8*DLv0}T71pHOVd+>hh?yv8@b#wJ!;cbjFK zenQOmdk&nQ@Z&hUWSEZwo@w}U?EtuI?8%;~@yQbFs@8drMM&YBRllzaJt=%M%-5h_ z1HQl$xFZb;e9d*`EZ2Umw62;>=Huj?o`&$nctzt2JZZ`oAHMlD`dDW^E+(7c3q3R7 z%NYoM9Q+D>ejNNVQ1siV7qlM-zYTsI@IZc~K`lEUXLfj;)_mM^oqn8r9P5|Je`9IP zs`M1)(MJ=xbyZMi58y9qJ}%8ZSXYhD+>hfspT;-81}E#x$I0i~#*a(nxeqY(L_eW# zK2FBriE#k!0Jv-H$)2g7$IV?-Wmxdd4}GjPUz2L1=Xoj5b#v&c^*pb0J}wPUdRIH`^1TTu>E zDdyv#rxw2HSiz5jU!l*BgI@-U{v7o}+m9n3sTZDS>m~TPB&DyXiI=!_)>AB%54^jx zDZ?bSD?9Gf{E#2~&GLyUtD7J4gP)A!2RSG&_$hy6%j?osH$UVDKgD01{W!kh zBizW@Pt5X3?x>p|@`GQTlH~_E&=33+-*9+%>E?(0;OBIK?C*$JpAP4$6 zJx#Blyr^z|$Pa!o$!vKcCrv-@``XYC-|43Nd*lZ{d_Nd+P)>aBTU?*jOVL8Ne#j4g z_+BmKpq%(_WO4(R555~r>xcZ{hwr084)g;*=!frF()^Gg{G2$y9db}k@WXe_@jYCc zAM%4AzV`w-z!%?FLjA*cnrME=4}SQ*2;_hd_W8$mp76Z@nji9mANDba9Ml)^Lw&(_ zMQDD=4}REB6LP=@``6<81=t6d=7;>?hkbt_2Yj%P8urn}erz;9`@IyQ^ zRNU@#r%QGVm1xFG;K2^G$Oo@`4fO$y3!oYOHsED&`nR?j!gDPv9%u%Hj*$kq?x`*ZlbBHiH8O28x(j z{P2)4@HCHF311tSWuwzt_)3h91nw7Q^zS+dT5_5VQ!WVb~-?$?zzQCO}J%_K^4p!%W0l|SZQ?t_6!8g@L`?#7_ zWF`~ZFZ48oFYpAukPFVSzQ-1+?D=9XIVi1z%YWYUs#}JI)1eP*&%LzcL}!+%j%Xvl}uLCVg z;KWE8)$5@;zxW51Dt}K;jbvl;ZKPf#G4@5d5NDnm&z4UgL#Ix8)7nq#u#kvQbqB8R zZvEHQc|~SsX4sPV1@oxct8~Vh(~`x@*?ueaCzjH`8%~pNB9XrWEt&mTTQD=d%#r>6 z2<~K_8umax9(5^myKv*Q*#)-TI)ruJM^R>zc`oQ_Xq*O~z&CjXi!X4efn@PDt}e1RwM6)s@$1@79|{GYvd0dp<6>U;Ni zAheA!V4OjKF-@QEF<|2~xg;dqd_+kI8DoOm5QDL?Ex$NfwO9SLrP5JLB*LPw?&jhT;qElkrVF zO&-SA^EpIH_~vB4U~$TRQ1>}8c!KZxzTyk+lkrVFO%9g#93mZj3pp8|u`{m!f+zTP z{(<5P?vwF74bLIc!MB%_bspFmhc9>z@O_)&3+_|!O-!(s_Z%W6d~*`#>dm>%qhs*| z-{Zfj_=5Wsd=nF_2;%jlAf^TAiwY=vL>EPSW3BK4F zhc9@7FL57mpMq~y`@p#$KhuRsfgI@7`-!gVO{CMoVQ1ArblI;iJ9@VE_h4`G|^Fq6hzrF8Z zr&ZhEsZ~68O}X`$G>yN-&QW}?zAd=@+3%Epchi5t6MQKb+({$BH|bGP%j>`Cth4Jo z_`YmwOJ;lA{gW@j7dst%$NDe+%Efouo%rJ8n?JHEo%lr|C-Eul9L0C2c4YmHITs3E z;qEKum+&$q<2LPLcwg}ovYrRt29GPfLwOwe(TiLrk9+>jHz!@*8Ls1MhDJ?3_r2Rz zUb6PBDtq5HD!HF&a^0T4f>a)7ew{9ld)hREmh?G(fcjyaD11v^cw9PupyaF*xTD-$ z;wn&o@bClJ>5LO&egHhdmwo{5u0{Cyq#bgZejttaFm@e$U*6uY?^X7aFAQ@l(58Fu z)pH}Jd_DDJ@WswJe8CfZQ4H>+k>LB}^SE@*eJ|x?9T#>w_>P_HkH2#91y5J{_CMeJ zkv-|~xMEIt9CnW3Yb(g~bHn4{71MYeybMXdrd_x^4&DZj>wQ3Z9Qh-B^lHgGF6po` z#N$3W@%hMcM|nx{@2Tv6=csh=%S{*Uc#O31xVNXxllv%Pw=H5fVFgzT9;2gF3H9>btbp&kT>Fei$eE&)5CDZat9p?dQJvu|rOJkW~;jEPdZyH=}(W zg%5egYpk8lI5Fnu!4rJx2jCvnr(T8loQmhFDdC%uAL!cmGr08|m&VU`t(|fBf+zT* zAKXbJ!S}54xMD`@BB;+rCHP{egYOuR>so*1;ybNe-|^Kqe`HrWJg%P;e6e#3Ut2)~ z9%uQ*G#&>pLo#mDE?gc5Z-dA6|3rBl`6GPvYRNqAg|7a2(-DvR_(UF8xY3?FvZk`| zoKYE9&Wb%(8>u|*ICUPE)%rNFSW>-sqC9L0BheH?g#FL;7GX(aeQ`8+Nie2Y&1J+15Gu+zbJ ztpDP#TztXPmA*X8H-BVLIy|oDtc!@sI~`Z>bnG0(H?k2P2d|jMu<#F&f zcwFy$?fN(ymy0aWt0nWe#QVY{9`~_{JZ|lM%1e&FNcmg)k2Q^S@5@cE{i*s}Wb}Qy z>*FLun(BY19X&3EP(O?ly{BqDO)K2DpZn&I>`EtI(|7zpRNiv0N}fCpJDqW2%nyJk z_|gx+-My<2pEDefD`eycjy&)WgMzw)8g$107wTTE;^;&C6H%;Ua9dCAH1RQCJIxXfo_!-wXkLzXh-hjTRpU2MOapHU5 z_B*$_`x(I#eCY>k7I(LS;pdy_?ZOhHtoXYaqu>HT=c=}T7$o_^li>5LO&JPtg; zmwvEjagXX#uR?sz@^jVi$;JGn)d0hXWW`i&Fxu}H4 zVW)%d7>~nGx%f^i*LQsN%^%s74v#Bl)PJM!~I=cT5`qxWajsV$6XA6@sWu< zuKmTz+e)8Me$socrjaw1%a?5%heHOzO?PRYba`ByUB2JLuy$yW96MX3h;OpL(;El7cP&3x549z?@=B{{t+W2vE+E1ITA0?e^ET{ z!xMSj;g>0IJNcmUlg?LY8W~q;^$#^3hm>ck!sCup->>@FafW$*kDsT07$=H%YW+-8 z?>k@f%^%s7PCTxk(Kxa0`P>aV;c>QJ#^Q0{3BL3LaF6O!uR?sza6GP*k)N-A%x`@h zcE;fgp5P0f;7%F|zDcRv^7?N&`y5IcJvXO57nS&V>~!!Qi^t)oTzsdM>x++X{>ZL$ z;&Gjf#^>lh7P|sp>>R__s)NVDE2i-{co~v$n|9&yICvX8uKIVB$C2N?nMRBcq6)%wn9d36(h z06QIg$NW5af-iW2J82~No>d-K%!!}J&NzJWS1!Kb=}O=J=bJyWCnX-2(fAzQ$6{CX z-_GRmd7um)2d|jM#4`%;_UMM9v(;iFiw;{_xk2>#f;)L z9nW|ib~=7wjK_f|_;zeR0C%??;pd-x9+ytMwV06~D13_Fb2sda!xuck7d*k8G!lHz zDv#^tgvVj0gYOtm$4|NVf~PBed6;kh$ewg~TsJ4{{(K^j>;HG3w5pB(?yQR&{7o9_Ox z@;GD=JSNXo&km2Hei$b@|5fYDtq0P+>)U+uV+ZeZSoZq3PDamVPCVDaV<+Q;ZTw^F zSq=?CB*)u&#C>tm9VI8ou7AA8bTKUK^K-{Mm|d7QO#XnoD(^>KDw17GS7+({!t ze3FtlQR15)JJQ0p>%?0rZ`rc{sebrkXB@uxD;M8s_Y>kX?aMhn_svfcX|0dzWP~sG zv8WuxQQ8$H6P6@i=%Hl73CQaCscO4IWqgcI9#8A2C7_OOD4S_8d_>Zu0uL zl@}^+YrjUenx)&(9_RjCp^y9%UC=PJn;kc18|S(Q?EjNPR07Tbk?zrF&m)x?tmR$RK!~#N*QEaW}e#EIAF2qkb4Cs$YGb^SJLGT|c$tY9FX8 zT=QEW*SB^$hi^JOu8>jxr9Kyx@O12S@Ezmn_$wFRY32IjOhHtoXYaqu>HT;U(u^>H>X7vZB8&A&s#eke8>Dec!DqGfIDd<_?}rFmy`8z1#4#< zzW6B@U+{FLFAww0AK8-*kL%{7|6=DDzP5tkaqx<1JPuxlWZb4*xI7Nt29I0&x60$l zAK{}{OXhJeboI}hj(FS$C$5j{e3tT(mA_E_*8WSHM#hzM_+Fh?BjwDIOnBU9#~J4N zJv@&3VVqch=Jn0vN*SFWclc?3>ua#n87Ibg9C(5+{Q%tEW`v)A@_Af3`&GLc;p^7x zylHqGb~^ap?!I>oJi(W8z@0P_e9tP6E9L}W>~!!Q`KSa_j5Ae!_Luh;_4WW15fa!AAoyQpL!MIb1K%yrL+FAl+pUBuIGML>>R~+{Qaun z3BKS7?xd06dscZ|FDK94u+zbJjK>{Wf92u}p04yAUw!jO_N2q(IvMrf=sp&^VjhN_ zWB6Ki@HlwIG#&>pL(;El7cP&3x54B3|HQ`QY+TO0o8|6TO**Os;rcjzpTnO`+K8XrI!F=lPG=8HX?a%EcEvUFo~u)Hgr&q_tnQ zoe{p=$D$G*hn++Cj;Mmi!7HZmICvS7eoeb@c^teA9(VHH%HzmCVuU1?9FKdktAE~f z6pwrVWFB{)@{;PCR2J%^GOnDieV+p|2tFn}F8%j8fKQx#NxvWPI9orA6P@yG9_Kq> z^UWXKZ#wasenx)2==od~JK=G*UdG~a;0eC;gObHPs!zQN@j1isxMD{8-PUgOdv1=M zarlBK_<|?6lSYDXQYyE+{+rJF$5KZ4QlE=T{5*C#_>RTn@K-Lr)5`V5$2WguS32>y zeomgNV&@pXwu0bs@QP_X4qk?2+@@W?6O6tmu zko0TXh0EjMZSc6x4=9f#|A-NiSaLkB=<1(09X(h5i-|n0{awmSx_?h);mxBmuAH9b zZ%BPF*JG*gbNH+{!#uw??dWj{`cXfO6Ni^)^Elu6ns5H-w$pj8TKxWO&W~I7TwjBo z@Hks9WAQlf1Yi0AxJUJ=S0O&9;<;)%`&c>-zNhv5s@Un^I~K1Q;3<81IED}I)9_77 z<(Aif(|N91_`YoVuUoJ4rt$OG8HX?aivAl{jxRpG`6K(%iO2OH&j-HPIfk#TAb1?S zVj7QwmmwLqX%{Y!gSWxsz=Qmxk;{$8B|dg!C?5AG6M5Xxw<<5`Z>jA4<59`|Op~Se z=)4OlX8@n6cpUY^I8nSZo5%Ua(|q$sIHePh>;7OiHl7k}mAOFg*JqzTUT~ zp7rmTtdIQY>%L3%QO-cm2h_g)cdDMFe>hnm`O&xX`>Ky}sK1`ocl*(ezd`NmUQ>OA8z<`{Kl+ZWKFUE)|4&q3;W?^j?R}H)m;C7KTYZ$n{i5&W zjjE^j)XDadAARfZ*7~Cy^!2`1?OXq0)wlK~ll74weaChkJLO;(`r3c2`ih@1Ss(e) zcXEUJ1bq?H{WH~f{9ctVzT`(=KTv&?cz-M9 zU?2LhkN0i5`pAzy-UCQE+$Z{Y?>g^acJ+}TeY}r`a=@4OKhgepkCdyA{OIHTCzOL8 z-ebUfsCb`&tB?HX~jdIY#{t)&Dv(LoUM}G9N{+)7Yf9UJ{ z10DC+kLKzlKl)g2O*!ae-6QRp^^>kX@}rM+U6jK(fIi;e%Q|aUANkS8IwH#9K6#$c zz8uzbx%$YDKGv;J4)&oB`&eh->LWk;c>YN_+$Z{2Z^}9)S0DM&M;wlFz=OCqco08# z^^qTa#C<3SJJ5FY^B}G?rqAX_ z-(X&8c_4cFKWX`ajkmA=>Nr0z>j)12PxYt7HxB=)rqS!ld-wJaS{um&ln+1RYD}6= z=Q(pfC;L0GllU{WcN6<=_7Ygq9; zpO|0`jnDU$n~%Ec7f7drZ#$#s`wQIY$WQ6N*cpc}c!F=Ks`!HYh;m6-d=nF_`)ZAb zFSAmc(!sautkZPw|H)2+FLuV^3!dP+^394bxV!gb@l8yy9<0{3TdvYX>2&bz{qubA zXY7o_7d*kY_}8ufwf)$wdW&yjg7x5Ld8gtkO_WXt-@*^&17GZn!xuckm#PML(nyPM zVuCf~f7i=9+p7=M+LaxYFC^2!x0Dlpg`IKu_I^zJtBdcns($4`%LK4)NlLJmw?60g z;M!+CC8$2U^TwA-knjHbR^`F^=A)ICUkSaO@GI<`wm#?nhk~GI;*&q5am;UV_DM{` z_x^|OzV)uvONsdvdIyV{`9S1zhBs;qeLm~*!D@M{(lF>g)Tk_H;17#C`hT=u3ZME% zKWExc+peSN+UMEWwCH}cquy?W-g0XDZ!sr43_IicFL;7)^;L>5xKGA6@icjW?`iG7y`03k zursdzf+zSM{Cd>EPSXNt_EiWBUsS5G!BeLm@oC^^zv>-@bj(0%>Ym%IH{Bbof}v`RPrIj^0>DZmNb z$Pb>Rk*8^#HRqsLuhVgsag}j)<>b9#T%7S2ypYQ}KSkpZ_tn}7BM~NUtnZ1Pd=6f9 zSI5`RKU3Lmj7sijnmo4WARwdP%^qic?<*=Noh$k)^+SI>*_iE*e9u4e%^%f9I_Ia9 zGKx#|p5l4_g0&OgJMH`w@C0A_0k}u?saN6C)1(h~MTKvE>`CiB1fI>mIf+YP=McUlm1f$3Iqw8s;qFJ{$M7;F{hD?mOBcfbjJ_wN zfxz3~aos;t9!GxkBA3tOl09*V<8kY+x4i90<;h*6lKYt^S8RVp>hF$!EpEOX@wjC7 zHO-!7eQt1nTyP)Mj~yrauf4u`TtB06qUU)I9(Km@IPk>Jw{1TFceg$H@-W~0*pn8I zYiGpMyVv~uJa!KGfr&g0Ji(Xx19#HMv(DoR89hJjdA^qdJLB-hU%B{#rz_7okLzVL z4|D5v-ZVTNJBRQcQ2~#GS4`t^@G>O*ns(vxICvX8uJ|vM$B}=;2uZyEx8C!nkGwVr zqV=-(S1#XEsqa==jVtbtXQc0Ku9~Nk+vUyLp2pQ?{CL7whR1zZ`1yS6IQ#!xc}oA@ z*?eU}QTC(P$@)$6-|Tpt?|o?*>HUSrQ6G#G#}Ci0mj~+2TB}yyOKO>Ke#*Teu+J&K z!F}%WNX6$YgOeBkb{L1IoYN)^ZUr$4JFi;)J=xA^Jtw$=bLnr}eqj59n_u_ExS!6S z_RUX8Y2m#7)%m~~JLkn2T)}zmM-^xAr(Tf{mG>@IJQn@<=Esh-a6Y^>A2?&@yf}j^ zI3In#;tc-OEApYnL1opWQ~Kt|jQcBNDJrUE&0G1JLkn2T)}ze?<&sVPrV`^C^yQ6Yu7gUWHITRpVHF8xt$aLjGgo1 z46fk3zOFcfKlO_AnjDD|-~8AiCtZd6U%Rh6dBf=b*SmM><>ZTo3mL`LqWf6vig`J9 z5;q;y67g*C1YhQv;69o!2p*`{_FA>QO0(&HGhf;_e^iRjrbt8CR2r-IHg_b!7jsJA{82IK;9JPazA5aSh3^wGmnQB-9PH#bH4a96 zEUHhvTH5@?NjG z*8kq;d0)gSU3-?5CJsjZ(684wwSK0Rhzz?k{N? z>E4%{F4}dZNabn57b!lOE(c`{cJC>a`xIZqqQ$P5D^-tA$npU3gK2P8LkzE?E zDc$pyNzciom}D>7DP-ga)<5DGkHb#JiD~;p!4rJx2jCvnr(XH)5Ae;8J!$PP=w`J3 z{KOMq>>OI3JaK;kc!DqW2kxYiXMKM`C!={-+nyglz0ND~^Vk`OFMi6!cUpO8eSbke zCp->2hwvSNY{26zznI43;AKeqHSNOXaqu>H9Oqz@f5Zq$y#KBfXMcg5*^%H#8*|b} zf@}kGZoJ`!;A)uq_(UF8`cKN+3ja-I=}$-HK+%+ojvbGYL14~RGG|54=5bThotlr~ zanujvMCadW{Y*2|mxuZ0kL*f^$MrJu^XbQ?ZC4371K8;VokC603@OJqW{0TmVUF0W?eE$P3pL%)aQl;|Xer5Au zr#%0we;3Yx0alv0n2;O!Z}NW4VxV!J;{Q~haB_pDkygzD!tkk^-f>p=6!k;@FMN15 zpSq*mtgL!WzI^io)Kda|Ki0C}pH$4r`eN*4-u3T(^A)%8F9@Rbg@dZ!tUHfu=~&}uY@Adh3e<5}b&xfS{ey!F|)PKPfe0%Rwe8D}cPrZ8iZmrp@T}nJg`{u`< z)cS8maZm1JQEB*@S)b6icG7=G^+foBC-@$JMDYdp(R@MhP@}xp+%GpOdz*_Ki!o5+ zn}47vrT$yUiT}mU;r?sJWv!nGU+@Iq_S+R-aF6O!uROL?hYEc2W6ur2uY}`sb;;*p z6pK08Z)@$mI(1#i)wd1%VQ>ZK>Yppl;7`3G@7$@B8$zU$Zgup{j~!|G;bKPTm`3-p z*cIb6c8>OAbVdCbJi&MEakJF~6qJ9jn^keD~{7EBUwtJx_=h>{ja&vR%pt<-# zRlfPLBe4E>+3S7VIqApPNk7(l8RuKX^;~?TdK|sFPtdlbg>+5G5ZUoG!_Kp*#uKF;%X z^^qTa?C;?GVf3+|iucyBFU!?Oe)O>~lycC=x?bLs#`<7aANkS8{shY5KCzE;FWC?3 z>LdR^pIw(hIq1Va^sz5tOrOnil))) z%G2{c^>m)=baKLTurn@h2%hkqmETc(!F@8miC_0=-`9KIXA6ThN%37akL~3IU+f&^ zvGVl#+H0@Lzt^&!20X#H`x*M&8r&!2oAm90^4^pyn>&@&WxP*4o&HI*UH=*Fzu@kctK;)&c%OPY{kNSHe6cgG|AHs@u05gng8O8APs97v)4{is z6MV5V4qxyD-`*z_UvQs{?`e3SdOG+PaElAV#A{U>H6pU>sytF8kNeTxu^fW^DM2G z-dl7(`_X6W`&o~lJ^G&3r%hKe@tgiP=)9v>RoPurdGu@bKI@3BI zr*xE!zb$><==_WOij#xq3D(ZI@fbY8_t5qOaCghI_$CfGFYm~&bj~C1yg3_u-TAd! z&(qT2i=AWgPW>(Z6@Pp3G>u>2hrtW^{%5%Rs_$rSZQoVf z-acq95-zeiR+FwzH1UhS6B;!+eo^>rjsKkdq56@|jhaSsKa0zo?hJzCJAz9qFk_5Nix<1zQKsAN3GPW&xNln;%ta?FZ@S zWZxckUY+`UXmsBm{>sIf`gCPde~KR8{OGx!_X|8B*utaWRlTPxuYzw;Psp1;`#sM2 zf3LbH3BgE~3oG=wkn*_6yej&oUR6I+c>~h@e!g`4`#9#)^W^;sUPV33+h2Wok#Bx# zEUmb5A)`13_pzviS79f-O83f}{agCa{Lb`i`Z4|b@FVtob~|r!%fI;x-F~f4*dMAd z)>AdtYOB7wSU&7A^QCVN6Mr$F6vQTt?EkUOlaQsSX}|8hb9NjK{o`_7=1Jziv+=x_ zdYQLhD_&XyN&fogr_8*c`^Y*G?q^=fcuYG6x48D~JD&RH=l;?fkNY{92VrM49#bTmJGZoc=w-SxLG zYqc7+3kR)5qLV?8ELUWW@weX^Cg3NAy z+H+qYcAww-d4_&Q??Z`N@M2e{zlP_ESv%v#ZSWl6Yui1zyQM!;N%$fetH?J$_S_KI z^%+Y(cWUh=`8an9JFiZSUzwVU;*^YM;7mP&KWU`zdG@~fvBR88WX^A1dK@|@{<-A% zXC{rq`#^7(%EB-GxNQ$I%0*R};0nKwpU3a_e@y*8e85$`bie=nn{Q6?4$VdV{_!)_ zudUrQ*}tvDzSqF`{q?t>m3cPx!FbVr*5rBte?PA(>$d7U_4!W&r_^z2o=b-3y)W7C z_j0oC7CYnoK6rvJ?H=6Sn)UVDzWK2yEx%v-s(ko;?3~x{gDW^wkKj)l>Fc+B^J53| z@@4z|?!U;#^Jna2UOvt5|7+*{5l(t_^XuLDzV`V0%B`yV z+gWMNwYq4wflA}|TVd*xR9P?_U+;ac`my2{s66?9b)J9p^ONWM1I6}YCD3)6NSW)O zsrWke!+25rx3lZTcUCfGa`ZM*ps5Jf4^k?jx7iVwoGfH-Dr}abEU0 zU&V~p^+)%y*pJj`&BOfX69QgEO-~8Aiv9A#4W%uJwPM(uv=V(8UYRBMf&KqXl;GW;f zFPV2C;bY+c6#GM??+M{?%*&Xk_1>rRH1eYtdGoW}d78YbIKfgT$%V>9(#+Fzll>2ZypPZPcQ)2RQ9q0m)qg#Ep5_~u@y)MwZ~mt9 ze&bF?ah>DONY3AlzsF9-3ETK(eWUp=dR_;f;7dOMcl~|zH;kVrc~D|i_~yrwwD#e4 zGJ0Ou_uPkzokQ_=gRT7+;R~MNOZ|a6X=I2`!a14I;hP^j(!#f$5nrzs{Q56;#^H;< za`B}eT^Zuzez-u|H$O$CwcfFp(fG`LEGn6gVdoIOBdXwW@QP_X4qk?&U(+sJ9tUq5 z@Hl%u8~I0!ki-&sT*4>pYEi`FK0cAh9sjEGlH!XszS#Ziqtd-EH+^Jz98!7Q*;!vl z{V-0HZrA#8>w&Z{5A)5B9jWoSjGnWv|7AZv(6M&L@i_1VU-|*KNA;;!;W&PVd0Z(Y zKhXJfKYX!s$PY~9ao`EQ;0f-ek-j|4H$Qfy#pAje@wmgA{P4xjIDGL}F22;GD}8yG zZ+`4ai^p|yay|og4&h7Hgc2SHub9T;;AKeqHSJ=I$64M6kE2lXlSVF=$0eU2-gpD? zxGC!&>DphB%Hz(?ddZ%xAI6F5|CJXWm(DpKg^YOIwDuPF zIrBa2jN@_O3BL3LaCgfK$MG}FA0fPPK880K;2IW7C$(dVwuhj!{^O1S}>*^yv z`gkryIoO3h_F=Q`%hgAI^zj^oaLWk;@Pm}Y zeWH)JGVuskANkS8xJxLWk;O7^)K<-fx2c=-oG)-=CiMOr-Okr(#adsmD(E zJ?&t4|D?eeJO}vN_t=0t`H-jQJrn8RTgoVoM}00T;Ro0mi?78Kd?^pyNh43sdnOd$ z>azDU=A{4jteunjU$mZr_f3Is+{l)3gx_Ol9KPTQzVuUYCyhKk=hiE} z%U&1T%gOkRozuo=-q&~hQ@U<-vG?^oBrl6OXjDAj*!LV7%#d6aKCtM2dQRN(-`BVH z2ll*$oAlh$_0QLM$(pl|=ot$dy!LI%UweOB<@(pCEM1z-YZokL?B~XBKOyzYees;+ z=$U8peSK>ewLS}f)3;vF#=2$dgK@mym|ZWvJnXc`;rbb^hZyUKbAABN#?ClD4W0vh zzgY1Fcehx@H}UI(0^j}akv-|WudkmIo{gQ;{IqEYVI0Kb3BH}@D8Aqx)u&!5zKLHS z6x`cfy{A#R()8S}D8{6NZzm_`Dr09HzTgSIhu>`RwYX2lH~IVO*UQb-<@Din@Ga&9 zU+j#-7d*iiUIOk@@J;+eRq4O??#T-so3+*zSNCG+bnxwFw6A2bdyRgL|HaNYe8CfZ z(FE?Kk*DeXU*SIC>-7C!%zu~0F zE@iCJeY#7JTV}+k-1wMV&(qTQ+n%*E&fkJ3_@WowNh42_zrCK{w~2qn->(0v`dj=k zcp?AskGbb2JXqN;H_ENb`h$<~qd6qGRu{`Q&}{bG{d}03{Qj8sRrMdpx1(O%{>uHk($`=5=Et72)_Ha_8jpEy!TroD8IQ3Oe>?4co3wZE zExl%TyI-HzkSV|O%^#^v=Q&|NBYdO#SnLXXvD5XpXfwYv@kj6kU&b|X=l945xkxB| z^GC&|gKsG(@n!6c!xuckm-+*D(#S=8FL{QgZ~jPEI`OGOPVmLfS@@cD)$j^;T_*Ji zFB?e9XJ{A0>oU!AWOy4q?)Vw{9GU#+MJ{o_9V!#a=-h;|H)a@&j@vy_`?WKjLxV3BHsA?xc}toyWB^num3L&oLd}S3i-bwKG~*+JBlKkHgM59tWP_ zOFsa2x80u}9;flvW$&MEXEdKb`7BR-t(`-DV4|M~Pw)j#a3_sC>pZTL5sy2u^Ly%b zUI|af&NzJWS1!KO%Jb!6zWK2$EgsiO8d`-Nw-pNBY$tB?HX zgGW$~tB?JC@PAhy`O$~pq8#+m{@9NKe{l7Yf1uBfla#}KqL29q?Rrd~&5u6T2U8CC zq7QuWi>^NMqmNF>c#ao#X-SsQHlS> z&dK9*bUqDuf^Xp-#TVS&@=wpcXvKHg`vBTG!52H3AAys5ei(QT@cl}~7u?B*JU#oO zQ^GeV>rUHq?(-;EJi(W9Q@|Zuk&5qW*cY7+zNL)TD^Q<{O2%jGjO)MP3BHsE?xc|x z-^Ba0mbWiD9elev8K1E;4qwhU0^hiEj!w@$%XH3%>*WMr?2O}A;0eC;Q*bAZJU#m? z)7cl$&dK*X8x76Mw9bd?ewMCx zU-?n3pOY`rcyafyjK+-%jy-Y7{?(J8d#OxPOFyLY@ViH4T>hlr8^3MV^>bf5M=bun z-rqF6E3bO$8;!l@1ipJ3^@IJ;K~MYj^v}b*a%9Q=L2LStW_)AT^?zFU{k4hjLv*vQ zv~`|P`qJ6+eK%i}HqQ{ve`n)-IO>COy!iFA>&5agt%3x9IYIKC%3gxp!&%bV|I_*L ze8j1-bJ{p=`n8F3fhYJLzEbf8_u(2f*NSiQ@p}m0)mPN^D&>Y-!o2Bp@a_FrKJdlP zIDEkqe2>=^UvPJ8Tk(C7`|;fAdw0thE32|Qr&UjktSRgUdp=zC8+HbM0;)UN7%#uRc&~S9aV&=18Z7 zb3Z3IW9Pg$gDW^w#o$jGd793Ryq?c#<~anOPcCnIx#m3^&n2iI`fFT0+2_l*B%L_yyG^Lf6E!;H(tx9hmfcnx02)wfPN&$smIZ{$aF z$Ord#YOPhCGA-U~&GX`43d@;%e#rW&j>pK(Lz=Gs-}8;rg=gqGfc3F`WV6R*-}{=Q z>b!nJf2CgB{yI(h;s}ju^39L7w8rIbM&mN;Ot_zUCF3%7P92wTfA%|r+n;?mIMeRI zdHs>u?Y}gyK~sL`n?F*U&U52ZPM#ZMr~BNP`T<|?1YgECaOd~PS96h2`sR;{O$Xn8 zPVmLfIDEkqe5pThCyiXh2a{)5`sR;xrL#V>^Hcd)_ko?W@GVMZ!86zo=kg8s*+5!e zL;oJ$4`=j|AAR6KIRia*{tXYHJq_!7!mK;8d=P%v{zc`7=s`a+O@6q@fpc;E@aSvR z4(43wF-(FOSRk4W8i3_y+D# zed?7jzw^x>*^>^wg`Dt1?2N+~Ji(Xx19#F$Uw-GCA3K5|9e!BM3BK4l3tz+M;2H3_ zQN9uJGk6+)oBln_=Zrq`qYpeN2R%si(Vm9&8GZ;KgdZ0E(8dofZ$v*bWqvsKL3VNc z@bGcWUy}_# z?63LpL+qTFAJXo@xqmdf{rmDe-~8a5)_d#wKbjAIh@G?ii{Xdh3BHVP;2zbdUitDn z-~5q1>F~pDPU1`08HX=;f-m(4?xc~v{LVK&cBI7*+d1Kf*f|T|kRMu}0iPS?8xcQ) zr{TBh-@|;)=p#S+zym&m9who`Ps92QKZFm$5Bu*`en@`wBU9#wb1y52HGi!}<(Agb%_G*Wal8ko@RJrpymtNI7vbjvrQEr+yH5^y`}L z{ioUfk#c*M*Z1smX8rs)_PrN*;fK_VJMM7*uJq-1zWK2yEq++dh#&S={rDkv&dU#J z_uzc|`q}N@m*4s32j{f-VKFEE1v_W?7sC(16MPxpz&)x@z4GOEzWF12(&2~gobW^J zjKdc^!I%02chX2-e&?GXJJRBZ-G7x2{*Rrr@HKo6o&ld5EFYAF4SlF z3i`lJjC(Cl|N8Fi0uEKrVsyYwtwV4 zSDvMQeC^r8{`_NSh96Qd?zqGKyV956`R2!-wD{rSOR|X{u0L*^>^w{hY*y zu`>=|@C0A#58O#3efgble(Xq#ANF!Gzr)U1_!>S3&w$U3@{Nd}!PD^D^zUIlXY`RD zec(Yk=s}{7_B5=|@I&|@{P5_5$`8qpeq_r0@Wqr9C*%0x(G%(ik?sGb>Gl6U+doon z$@0UM&m8vWH@ze7yz9Kg4+r%kZ9x8y{m+-*`R2#KwD@8FYqQ~pZO{EF*f}phq}}6R zj(&7@`}gH{zWKp9t@vR(C-DdDoaJ8(KLk(kWqbqos6O?|m*4s3kL*c@A9i!X53w^2 z-vOS^I1TPmed?7jzw^x>*^|!xly*+mmtyBEd<~z2XTax1`9{Rg;AsQDZTZYFpELT% zk3R6A9P}X3M|&F9XZRs}5Po>_$9DapjU%ETnKD0|`~1*2et7sh>IaeS@6&Ymf6n%g z+-KXy4SSzG%nx61X87TtUYv1<`*)=;zw^zHJ!$d7-tF1&!;|L@wF|eAPM$wv=PdtX_#t?LFXJ2IT~wcX<;(AU^GEiigKsw{ z@g?kx!*_tEGfsnhRG)g~%kO;iNA{${4|_S8-(lx0d<~z2XTax1`9{Rg;AsQDZO8Rt zK42JTUP>Xk3Q^UWXGlMcSc zoWu{YGY((y1Yhb8+({#S`JHcm>`3eRaw#Y04`Amkd=1%wXTax1`9{Rg;A!}6`u8xO zGy2GnKJcI%^dQkkdm7ef_#u1{epvcF<%i@)Kl1%wck-r>yfz4;_f|jr$bIF--`FN^ z;7*baGXld8e=$tW_dezRcd1`Q4iwpo{>XD=_gj;G-JSaBO(Ku)kSG1}FMt0To?-k7 z_27;>)9&cuN2Yx<-{-#hDaG)^@I50-es4klu59=r_pzviA7bZK!BGC6^550l%hJ2f!FUqo(5v_VmV2)L{guo2RO-8xR^y8M;~D7$ zSw^&(apSwfPv#pp*8W7tjp}=5^Xid8MiOS+h(9-VB+DsGFm6yEj2nfw&aRgS>djiK zR!{sAb>I9{3Y-f^+HLD9+&T+M(|Yb3dIw z?VF#H(((@{FU^O4z|MJb23K%C`bUa0_*1XQhst{wD|^Y`^yr%(JJRaU#f;XOaUY9H z`ZIRUi!-=_^U0y&4F0Yi4>b-ds~(-wH$V2Ig>yG2{TVyw#Ti_|x%5vIXYi+9k@xOx z)^}@r7fCNFee+XZS~yp8(x0(&UYx-doDY9daRz_t75PB9Q8rw=w#g@pN#FdGmKM&v zznTyKjGgo146fjO{6}`&w*8uVMcz@~e000KnYc&$=Esh-;)DI1JU_=|@C0A#58O#3Usc}Q zs_(8oP-(2*+uV@^U(6|e^GC&`gKs-0_+sZQe4mj1OWcb%Sm|vV2O~Zf)u&#)|0!<# zT%Vjj)F|&Yx9g2vH^Y>)=2~4e+d!L%gZ*5Xn*4srLPz}!vilZIBL|A?MbE*tW8W)@ z)cAS)`S7mZ)0QRmz*gV^>=1E7mjOUnidX_p#IAU$;s9=s)NElC<|c z;+)2FlEa+Lo3YcunQkzUraznKs*F?ab5(xGIFF?N(>{iutA3VbVm$l_@e%TW!1qW~ z?i2C_{sRB8_Ur0DD2MWqH^1I}j-n&OedSh_-^?Se|5!BJK(+B78U_61#P`M@|BUq? z|6b+#uc+{yFom0mZ$A5q;IG_9%#TopmSES;!ar4dR`D8J(B@@F$IYaI?HqA(24(=8uY0oV%|(dBaPEgxp`>sytZVe6-TKd#7Gb{yeXflXx6< zj?U+$FFW|cQ@}TlulV*u-~8a4)^qP(PR48OoZ63VMZv$o6`ZL@@F$IYq`Y(B(~o`g zV~3nb6s~_;c0VrVWZxZjj`riIc9_pGZ2{n|@CG0d~&v2alWQG!{?rWqbqos6O?|cOR5*{>Ywm@a^Q} zJ%QL6hc9@7FZBoRq>+i7DVat3=8sgR^PIJilXEh#a~8fPJ`c};&qaJgYZ88j#BbBT zhxwe*M}G8y2j!p#i9XuXu)Zf`e1Q+b534_@{E+ZC_Y&(tO&w=RJxSp z;}iK|>G#zScK@x)>Q9ZzNYmu2?o-u|BQ=hn{&V0PC!4dhPnkzjKa4vk|9UoW@SO+x z=8r1iE}0qJ5G;EhSHy!Y`;W&(~0MHbHWR;)4^Akoj&`W^6zfOXZ)3m zFL=7rxBvO(kL*c@_ZM<O}lV;9J~!4*ZcR%S>7{FRIEv~qoUm~Z~bu5@@@F(*6@ zJIC;~6$FoiS4`t^@G>OhHtoXYaqu>HT=%VZU9FAFMfm8|l6hRxVPz;D_pyobxRu{f zUb5Czx&ED_(!DP?z4A1T$038DoXNUc@Nw-~R+{-9^}{&P`S$Ca$7ST_3tyT1d2Pt! ztews{F~;M-6MX3h;O@33{QQ&8Hzjz+Il7 zPbVJN&uAV-eJ(2DaoFkLJI3SiS1!KO%Js#^H-BVTIy|nM6MV6A3}0J8@HlwIG#&>p zLo#mDF5n49pLwndZ-d8mKBPR3{1HBSwPYT5tE+$Bv{`qj&s8V$xV7h={G3^bU42kx z=PO5LTsdvK-VUieF8y_P;1g$G((mDM)DPpt`sZld_?}fBSIS8| z4m%xu$9Nq6%EcEvUFkc%`sR=9Nr%T3GwQ$5eJpkbPsh$Ne62co9K2#0kAs&X8MkQ{ z@C0}qybT_A^s~z2$nW0G`+weDA9rVc_ktXJwBSAnn=9$|i7+1b%b{@}ofwbneW~)2 z_Fq$Z_~oP0y)QRivhg^ioRcE)xb&Z^x^^r(4UZetkA1FM_>|c^&UanBZ~mwr((&`9 zjK+!Xm;3QJ>>L{>ob@%}i65XJfO}M*dgZ$=-Zy__PdfPaGs3s(i7$4>;R~MNOZ|a6 zX{7JEc;EckA%sO{;LBg%+Huagipo13SNM7CjKddy<>EW-ZhZHr`R2#2wDvo<|5{GY zr?7TjwSJX)aV2~Xeld;D!OxJ4-?R^x&%xi|bKT!oK1Y7njwQ$CUg+wdHysz3>wdlR zlcV!0i_aUCape^4`=*h)PVT061VOsz7Olh?=J`E*j{0G|C_Fry&-u>VeDg=QosPdR zWwZ{Xcg~Z~SvwtnFcy~sPw=H5fO}M*dKKbxD&lhKJb&x`$bSyw^zMD1mNfnzI~{z- z;x^z3zT5}6lSYE?S&hr}bAm5+#^H;-y$##f-*@qUSm)>~zM7F&+n=;7dOMcenlH=b!v_ za_R86ZbtaJ^*V1FKY*PMzGFNNJi(W8z@0P_e9tP6>*WMr?2N+~f92u}p04!eVZQkz zd(z=??Vr!bJPbR>@U;~LkAqiC<8kmZB;z*i!sT)BHh5g=ar=DL#^oY>^lHgG?!~VD zdD9V(oBVury|3%{yDwILvhu*Fj4NmT(=~2_wC9hc&f~x*&c3AIn|AcL#D1wC#);$A z>zv2EHJfo_-Q#?^@ca>Lr!!8B@i_1VU-|*KyX^-*|K#(ybmFb;pUDQ_wVVCot=Jid zFL;74c!E1=B>0|H9#{IgZ1AN%7nSgI>~!!Q~zM7F&+n=;7dOM zcenlH=g%yU%gE2KKi8ATSv%wK1yAq=PjDxV1mCmDE>`%0eY0%Irsz)oi5{k`VDtG9tKc!KYsAJ~4OzmNXjS>LHQk_P2OjcZ{VT^;_tEZTO)s9u(kgpd`4vZjQHHjn%{h^Z|#i3ci^uae5prQ`t=Trud6gc+TeTbGoKPHyZ;t)@_ZFL zhwvS#MbpoV@(H|R8jpjQ4W#wYv|MPw=H5fVNCT_jXn`Rz{okRGJsDQ`8E2i-{co~v@O}lV; z9J~!4SG?hm!hQPWA2C7_t8aDVaSvAZ%Z+kt!2{*UWe$`}Lg);S`=!vh4^QNAg}FY`((%u6?nN$H#;9%kPqS+{f-r`}`5gPfNn%sF!)i3E%j;Z+_~-#P7}X znd&#V@fyDpj=wgW^NPA2exM+gfSp&T&C{Ldth9S@u0CaU`}chg?wcQ+13Rx@_Ip=5 z8O7zI`&jG>e}J9vbyo}h7(Bt3@eSPFe7?`Yee*~5q_du?n-hGoGY((y1Yhb8+({#S zpM(46#}4xx-NfaV-hVS%&m7&yVpoIyJ9%H)K$-cSiOaz=;Byh*(4WH3koax-_b{I` z`pAzy3ZxwLAP4%aUl`W+g!mZvApG#~7wq~w8}CCu^5zwnAKufbAMEq>-15#wML6Z^ zLzVXGo%MQSYwnEphc~X=5a_*pXd*u>Zm1tzyG`Zc(?=!cbw2h76VI*c+jtC8xZzy< z(D%NuD=mp%p?(;5)}A_>H{83of6&@U9te8)k!9UcI_tBF8OFL6Jf zJALO)d3SM^Hc5Rt`1UfI*ByD{i=A=!f+zU)KdShGyIZr0@AjlOOt9{&H5!Q)BD#jy`0BFf?fs0NlNZ0# z&;Md)EWQ>`@GX3i;tTF>wOV`=6RZcTwe6OxG*LR8{#(i@F0GI5*`Iw;o6v@1!iP zhj%D1IeLZ4(*2{7`{{moa-93nzApo*aqic}u7k)+oSXV#oG9L<^+Ub5()t1SiZ8gkz$w0or(vf)&RxpL50swcHxI+kIDEkqe2dRe ze8GJ(zKN${!*S448Ru?i#MAqp_+n=qzTgSICoflg!F@8miKk)1_@2r*cQ2#y`PlP0 z6?Vqq3!VdfKhySK+m9#Xn|K-)oc1_(KcoJ;{zZP{Gj_(}Yw-l%&OM4RxKGCS?8dnZ z89m21{xUy&u`>=|@C4uXU$OXF+^681m|&guICmkV{@d~Fzt|avFL;9Q`n`%TxKF`1 zF~K_RaqeD5@2M=V`t@JzjKdc^!IwAzxKF`1F~K_RaqeP9zStRu?*LC{zW}&T z!8b9%I`whxjGjZbJ^gRj+8Kv0@jUvki>I4D>v8U0M(e!XdYv~-oEtmi;@retr^UI6 zTMwj-_tGxhI5%-^;@sFxe$vQv&Qo3dV3-?k;5^kopSYg88z?X7f1k>=e>^I=pJ}pa zQi5SmiGHmKa3Nd&(`{xRv*6mxP0?RcBS*Yvy;(!qpIh6ZtQgZK;Z2215fa! zAAoyQpL+Fb_k#t~zWJl#Qo=W*IN71+dWDX)GY((y1Yhb8+({#S_i_2=$BwklQ*CGT z93#4q#jf!4*cpc}{>sI7TB&}!orAzPKX#>co@)PP+3d&WJ{FY*--2Yq&Z+yctzz?g zvp)}hF^$i`&ybAYw2xsvXY`%eI1u{QoO5KlpQYzHtY6dh42Q4Ob;j$fDqVf#M_=Er zho&6#72mGmxt<+7=JWLEritRo~&?wf6nNWPRjE z--&&0PC4jnf4}N0{(aSR^u%O+RUUndJcbQvOe;o@5I(0<)H86 zk5%8%m#Cg%Z?Zn}qwmN*XQZ6c@2Q^Z@2V`kRrM4)ll74weI0xLIpv_I^fuMkeT(Wj z{+Y@8$dA4i?6VR*Yrn4g)_+a)wEyE|edI@9-{L_z=xKjc^>yB?dP=`PSs(e)SFq)Q8PQ4adBZ~YO~v;H}g?IS<> zs#YK64D9-l-tYQ%s=nTrPS!_$^!4n#m2$AFWA$~uQuP!*WwJi&@qItiVtB?HX<2_lFLwmtK+8^&Fb@h=SeY}r@a?po;v_IaD%)5=Tz%w6ALkiU4*r94MOWI|KR8d^)kl8xaegl4 z6#k92WAydEOZ9P%v8#{#1ATViKjqNR(0BOd+Wt5%c}$d5zUn!}gMGHHKJufF{e+YQ&qd$yZ>c`^ zb-MbSLdjtB?HXV?PMx40x_Rr>_0KtUkLh$JIxE^s)bda^Shx*Zw}$$375OANkS8I!DTZ z=c2FpM%BlD6IUPk(Z{+v%Aq|IpJ%*heWR<7{ODsH7v<2N(YNvwY9H(ATz%w6AM1uF zhxUxV{*mfq-JYwD{ODty3gytA(bxM^)yH}vS0DM&$GQm0p*^GT`1MwwU7zCWBR~3h z4o^9>XY>_6sQOqB;p!tl`grb3Ikac=9sQ{4%1w4ai0FcIYyj2;_4$m`iQ4f4*IZAZ)lkkNC21#fonbK=I> z>Bf!6&hfE$f^XqF6kl*3D7F{A`x}PvU42DuuToC(@|)0>bnxwDw7$cw*Ll<6i=A=! zf+zSM{ea>-tsg7CiI?9kZU4#*f#SRDb6N|3Eg#PXuyfjT0kj3AAiZl4T?Mrb^ zybN!6pM%#vmb7qQyDc9$W9QsBTU^1p{SL(${3qj_csbrM&R+Xj(!zN?C;b^a=fxRZ z!MRkkI9vQDKh@99HTKFiZj^{pSWn2mA72 zrO~QYnqq*w>0AzR56(3X_F6S#(q83qZA)smcER56i@zy2Xa=>-`rd|o(Wr=}n^tTb zi1zx%!QNJVWB;I8<>T_UROisg%}TQ=m9lYgU{nv6U%ymoG-_Lw4JoftZd?h@)f=^o zrl52CS2k*U%~n}zD=_Kp+D;{`@eqacH{T*Sn9t1pZN{5q|O|4bU9|N|Lo7M8(#md%(sTr|kci(&{HM!XeFD}aI za{6c_Ox7<17X+P0!}>07H8$&86|KYbw-hDcg?;%~d8`#k^K5LkOsg^CQn?Z4kfd1C z3TpfHK(sc>`+=kc^j&kdZ*#}gl4;%cN}BlQLBllGb6bs?z5y`TnTo? zKBI2GuFc}Sv9nRxktTXcYNg()>{NCG1Inea?Q7dMB{c>m$r14F;9Pl2YE+t#(P}a^ zTaDM;D$2rZIU!zKogfm{Kyc2KdTzT>-!-L}Or|f~5^RQTObWaxokiN%o;0{^bIN?n zb{5faPP@iteRtm=9)i&f%x|T=%H7EgH!C|k=0-OIx!MeNL#<6?Mzd0RG}x|h9yB+$ zYPRugOC#SmA4(UKPI^(gOS7`ql#_KE(r?4w8g|-X?_hW1!cKWh3aZM;upvXpPOWt% z2uBCexl?XLTBScorOSOtXC4$a{Nb*Ff4_FA-je#?5$w#bH>5$ybyzcFpSGmVYP;p2 zcF+_!&u#A1_T?_kb$xrgSqU3mIEn@3o&9P#Xx60)!WuO9Tfgwl(lCRv>D%(OZbNT- zkR04=^ohCm==b){w;Go>HtUT&=_k@!%y=m+)L`?<=1x$5RQlMC^rl+n@KwU$X&%Z)7~rA?D3 zBxGT6<=qSBJJHL}5N~Z7up%G!;PW!p3ds$9 z>$Y%8>GI0oNHpu)E%AiXN6TB{C#(YN3F;SQ=r#&%T1pMMZ8O+!UeP}r;YhHdZNmKC z3=B4D=trf!A$8oST@dOJ5>g#MLN($7Dl&-ZwNkNqttq*U=iLi0wQK5iZEt($!1zb| z-Gy?q1`iQZsXq#9alaxYONacyeGYwgZnJ*D@P1n#hW1#UVaej{E*$JgM+(`zxL|2F z;s}~$`NFz)Q_95<67xsMpR}Sd@9xEo^+5jYls6Cd$_?Y~B~{;S3BhlMmpbsvhZoC2 zzKo06DDT#VEeCtza}Qc-_NBdz%jX00_m=SQt>NDnn!mf1_P&uO>#n&lE!#{j!U`Cw zu;@drsqp*o@|Hl{S2+AN!yj!5gAeCC<|3T(=qH8~hM&lVAgT8ml(!9qYd0$U^7^&l zij_h!rKJkRtq4tSgsyY1EF2*8BN`*VZF=XBF-sf zd2$iz3#6@{H-Cg$)+^Fi1bu;CuZ1$&DV z&jyLju+5s@A*I-iHWA)6-!#P`OKp*CiQ9NI9B|CgzG1qLRJZ0orw-1{mSqYNvSgX! zG!2E7`9b~B%0}bjg|e|(TH?+iv0G~ouI=1be=Ut$h*S7my)?hHEk=gtt(x4Nt+heY z4ugYq*c}bB(Id$U{JmhjqD<++mwcEHf{Oxs(|jTwOdM2L?Yk8dTd0YvlD1%m z4Uu81GczL7y-fXv*ZYl{OrFKgOY-T4QtW*hw4~0IgOJ(V#eJzK zgS7lc=H>g_GA+I!Q(j?k@<-;E?fu7$do%xT34|g_)^K9f(&=VMOoDTjEs2Misc3L6 z{DmoBf;RP*+xhiU8r0V)+%V2nW0`u z!>{kDpFL-0?-I8V4zwZsReGn6MK`}je0WHNv~}xcbGKeM^J{r;+|FisziGX?iO~o{ z3q(zLgMz}A{7i~DZ~ok3Z`;f>?5&5F()jic0{I&TMog?|d#8R`I*+jX&~Jo2Oy&t{ zp1Km#Sp@{sB|@*(teORlI+9bK!fe_Zf)m^(xgk_C+9*TbsWl?l^5iqb-^^y3w4>RY=*+< z5}s5y(Tq^aoyh2M-rSMMTdX{9CI~uR(9Z{H)0S>AP=q%qwN{qtsEOl+(?csZE=wfA z+<;+Fo6@1AgKt#A*pd0WVd6v*Ri}dP5jY*A|0tEffQ*F z!RD5D0tsJjga8dv6^ZXe-|f^T{4)4Xq8?X-M%4G^#-;0CxI{NQ*Q`nvJbGCIUuuL* zPGpKE%&@*ES!%+zgyGfpWC$_8k+!Pi;c#MO+k9`jw3KJ!W*gGFWXgVS*Ptlg_1tb) z{<+=IC>00No5HjiIL_@#wM+Hw8h&qvD4Ps#P%6&c*|{y73NuL6Nvuk0)K*}4c`2+$ zjaP1m*Zbk$o$#+zV5mrBs9vPCPp(1(MTQm*xOkI6Ts>wu&YDJK{G)`u!ft2AZFA${ zNUV5S*u?D|Txbga2|Y;Ibj|44sDv%yQeEC#qAY&olk%2Kb0xMRF2#PXJ?zS^cmavk znxf4lyQwTsE={=3`A|?SONc~jR60#--vpZvF3BipJhIfE84tsG-hObfXP}f1%}~1+ z{=Hxa+e^Z&h2lx;ZdSs^qh0e-AY*ry>n4V(V_S!j?A?uflzu4H1Fqb)#1kZN|j$eYS zyJi}EF7(6aWX2_0rLBc7M?8U~%)>9~721c?*P6k~xG3}F$Hb`X5?Vfgv-EL^w?`kD z@SS`ahVev7h}S%@lMt^F5;dzxtXsN^xkKsKQb`iSZQ7w|BLqWl#omKdlCdnTD@9K( zrP{+uurwZHh*2oo!geDCndWmPu#7;W0gaGrm_f~il0;P)j|p$qG=nfsq<0>As&Lp1 z!@e?hm~JmE!SD^a$I2x$j7V3JA}&fG-#kOq=Tx=5a4?j#F~$r^=fV+Qc!mr|I@pUF zG_FWEd#n1&(C~1UCDqz6>{kW{p=Nrmu^Hv9`>jyQFRJBQBkcd?V&kIFLGvWZ6gKoh zIh?vjA4m%w{l%s{bqSgCIiaX>e?m5z;m9u3p)I4B{57)%GtV{y+lGENNJU?Wzm-ut z*bVDQ8i5(ZP0Tv1S&99cI@R3b^aYic%zg|}(D0M-)}f;_v3SX)18i6e0;y?!TlE8( z!*4_*gW4Nh(0*l}0UEv&)-NF{Qz?3L7o^e$p)098lh$5u6Px10HibM&esgKGiHEte zXHiHPHSbEJLnMWm*huN@=GlO}e{rkkTf?!qsh2xD>n=e!P9Kw;4L8Ft(?h zE~GzNKM`9pZY``OWATC%xn)$|qm|13UFI>6lF865>E$c;#SQD_ec_Wi8H-*K4kBg+C=h4mf65m+?htsg5`@w~)T)j+zY_z}?TZlEU~&bh&ZqqIE_ao8h~9_v(AQ@j6yDTG4D9vK>B8XLAN^R#7Op6Z$5g3rV+v?Law zob$4@9GO7K%)~IwaOx;e+cz#t2v#cFgdWVL%w23WMU#=Y3BL`!ghVrCy@PF^+x7CU zjKI?S4Cf4eOGCz(?TVS%f3w61FAGtS2u5RHCPv~F9vysmq5P=T=o95yK0|5*;;D``Z z+yW$6U5X`3(aN$Nlf2%pH`?Yc(n^#VNWgRh0ZcdDbQ1!Y9!kKJdkNk2TrMT_&;yt9 z|NegG%u`ltfBu$d-OrJBS%}j@=jF8w=QJ0aEKI+k!^`nNHZ2*hM(L7;#W^f!(yx-W ztqjF!fH@|oC-MgZUNR$bFEjIN6J}pPrLhM^F+l~g8j<^j1wm{mNv>#5(JoY}7ggSQ zr8rD@VSrRdKNn23%&Z761}!aCD2S`UD)t$ktav;=HDVh4>~ipX;JLfmVnyLvN?Z@%$KN1HQIo)qPqkx+~T!?~u1 ztMhPnCL*VXGF@VzF(iO6vP46@EJ~pdRL26;EDu5%^lIADI0-2Uy_2KV!D?awf`zQu zIK_8Z{-8>bjevf%pxLh>IU9VK9aXWoOv{)y?G$bD^F*Su%su2A=Vd=8X_YvH-N7rf zl})pNGyvJbZzhhPVpi$OUP-@(r8CDl++Hi8w>f({4G@*|7-g1|g-y1-2wA zV96=s^TDLp=tepz$!!lNZLxN#%0E{GC;BC^pFtk@1^~Tnen>-5fvXY_qag`3u4(cH z*-0RL5t}~Ch5dslIDqP@JOFLMsw_d7!R50*%?Ho>K^>>#L8|3_UO-E{gH4CgEnzxa3+%88{ad`Li?9M5KHR_ z6(V5Ut(_nctwogKv>aPWdtB`@ae=wGpw$tw(_K=gk-tz-amYJ$ZFEARrCZ*nMOyueTDvyLxjfQ_(R5C!I#$>%vuf$l0( z&z=TE%^RVzWg?g|3@bPryS6?HuGR($V8*H$B z$Rf3r_G-UuCj~f6D{uvCxN;7xh^0pITDjlsTxJbfOTCj$snZeGRXpp$cr|lco@AmdU9!+^_kLw7Sfg~n*x#X7FC7GVKf#vg2v5V-i-^YybEy?)wJ91haq5ff|21P zv`S3H&szF!L58hpG?S4Snj+K;mW_`8#O{6>>b}fMof@*gSx|~3FpN1enOP7tSUMRq zl1V5yJ6K-2$R5RB>U{zd$-fC7I0kIXrnsn|Wd<*DwGa6S1=x$EX(4>G8prUibo{H( zU7-`l?09Jf89A81pRPiP)ofNL(K}bLEDUUzWDYQV)Hj+uyE5}&_@YSz$p$lVg25Ned2<&rW(U=s>q&Dq6ZT zkX{HM?%z$WXs0JZwCu2<5(sIPB~F2eA)Oo&?+!mCau%a!8Q1fhfQ40zZ7`B9@`NZ< zmL;rFRsklL(`SziP7p9MR#Av%r-u_!rWKd%ftMdoh_@AQ-R$l(8@~stC=gM zkofqG@Ibzvhqn!J+_8g&O<9vu;#}H~+;M)1sm=z7A=DIVS*b!J_u--q_EEaAqm!h? zhPl~Q*=|FG&7Zl_WEu~;Ng zsIq{KOP683Yy%2VAwCN^opxVZ)S4za$(=LbYSLEMm&Vf-~G)GYuAPxSMZ3T_98a{41Ug(Ya|QxM zhDbGhs_qpopSW==1In%8IubEXO%_L_G{hOP^DuzvE0`dx$Vqz(+%wlhr zrec2iuy_s-*ZeXajF^3DG9gow0hpbd@+k3p6s7?^5XAPKGnWp_a{Le&0IRi&wP&U; z?!UA)vwCV~W!%f3sGI>8k4XoCIroM92<$5T;*_}opB!+)W=UkO zCPc>cL$H3GI2~j`OoNG!GfAdr4q=)1PNw!?GS;pvN<;bsYl7&aZnCor%QJJ*WJqeV z0%k%2;R596^Xd;Xxy*KbgC51a5J7|H+X7*ytCh1Z$w(YRM4J%P2^0Ze1dYo?LVu$H z66P=}D<&2v=H@RgV`Ze3YjzTwQj`!5F8GJkY%O%~ zg8C62U}Gi66N{A@q&vCuIlPxm?a}x_#*u7zSPo$S8W`(wm^lmm=H*L(& zg*|+&c>|EfG3NUMa&_5FiUgGH#JWWeF~X3=IU3P*h!LbdOYVI2;_&iiPS}CqDnxcV zJ}Z}OigT?rX`Sch(Pn4e1pDE}V!1E-xW#hpv2lJw5w^W|3aR)f=Z)m5;73-I(Rh>l z(_kz(cBXVrT`lojMe=T}vLRm5AKCj$=_D;9We;PpB;6FD5@u9FqbA*NQ~Nj~;@oE~ zhDkGcLzMk4nRcZZj!7t7&0H2Ew1JAVT+*NX5^)2}-`vDHvwf2dhF($EL^ zYvxk}p9?Oy1!zN*3JRj4e%pYq_&QL9w6sXi8#C7E!F9G+BxBtOERC7?Okd^(9DrC2 znfB7@l{^UvBjr@mrHQ~Gv>MP%&rGg^CxuzO<{5ddy->6oVht;OfHhTF(Co!zcwNUD zQao?G?^Zf%8F<% zI1g>dvX>0gl+_v3AU3_O=p)qmQa7QXfp$a6DgsIpW>&c5Bh*uNtXl9Em#8-69!p2i zWiYWQesLr#GorpF-kqM7&mww{hP!lw;sq4aEq9;fX#Pq}7E^*Uq`axS zrwHohnaX%itYbZaNKLJbj)3*F;*0KaRk7|x&g1PdMgO!BJX=jElH01=VY4}7na_vF zkNmx62y!{(Pr;nk@`c2pqS+1QTU|^eLJWKJ7;PYko$Emc(=J zL-r(%8cEB1AOs=NT;(t$053vUN)8ZJsYWF_Bf7rGb}MNz!bWusCt9!>SK+}X$y_J_ z7E-RT9yJ4+KpNFJjJQBX=Wt?RG3Y5N{um(xC#I&>-Q%0!HVpyk#JMY2n>aDj413zX*d9<7HOVHLIGOE`xMUWZno`<<7!o2r5c3>w+zg}+#)*Kj zz$eg$m>dx{CT1|!$GAQ8Q^r4?84)!Tp;!%)g{Ts0TjM~eeGnT+Do3NiP~^TRwA5c3~8Wf`xToe7=K7nU$r&fl)_MwHILC5`#GmFv{hk%R)0I_ zDpMp`r~HQJ2e1Q(5+I&(hfUm6Ll-#iXl;8Fe__vNh<5va8i^AF01<(G~!2#QckS547tUkp6QFQcUr3R$VmCXUG35iu;*HD)Q#)1!8168Cn zxdx2ifqD;(iEnc*c6<>nGJp1Juqj?{24EQZSktVPv|xoRNVTFDM)11iwhzg7O2}#W}$izs294hpK8{4 zK^w(+h>;bJ6^O0ma79r4LXNRAf_!eS8*o>~FvUCvq{FTJxT$(kaK76hbkw0b7&JRt z#4<%$Vhl7YeEF<-4CWv-qg9c$ysc^(} z0GRKbljblf8}IQxJ`4RTNjVsngR^iUw3HfRTgP%=g|HPumI$B+M5@Gz+t{qTi7Q4I z(QT`viHQ^(4)CcA3C8AzPK*JOT?Un6RrIQ zANUm4rL^cG9BguPn?$FeAR)D40Cuu#;cF9|C`^)C{*Zw-pjF1PM$7*OldPRhcy)E9 zDOi3p^3B;YL0W{YP_V5~HIR%7bJq?Bt-+Jn&IUsz-Bxbg9e}p&PEgErpxq9zR`d#x zN7zS>g={*}F=fIut^>}QQuCWz>rN7fk}9(wMW=7^m;~YLpgo2^>hTD+1S}VqVCZb} zM^iI`o1@YC@TF5q#FLD9~r1XI8BRb!0V1tz=L zOBe)NaQE3g6&uE~(%jCCFaddt)SbaqELxnQ#_0xvH|xZ*@6LwpnaC{)#2&@pwq1n< zA4V_@XJAbrYfFaYWhZD@Hp0U8mVI#2ZWUA^m7$nRq$CPqt$-#TJl!C9pF+ABVbUy? zfKri%C=;9zJ5akD8p-P(5givbf(Q=R%!y@;>>#@0W2dBdI;%H;phSKv6)O@*VprBD zTbN7(Va_8B8l72AwW$+2_9jGf@LdwXn5P(GYzk{1N6Q51`?ff_-VU+O3lMq1Hlxy@h#EQ!3QP={p1#P|H(G ztlUmkOOu&(e%^$2bqq%elvG}k8q(l}(X=3(DBWq`1!huW&5-bT+}6%9lB=?wuQqWA z3Ng9w)PD`8O*U>&|3U~&FqEck5QHepd8LsRj~e5is0J3ajMJC;%OQq5IZWs>=tj0O zY8i@W|MgJ0&=m&AxrofFchj&HaaKrx>Je_A#)O#DPJq1)U)1JdV$do`tg88_)@44* zF)U)DjV?~Ze!FNaXolpr>`UvAN=c|p=FlRjP2JysXVwwhs}~xGTG9vDqNIs8g)7}( zP-Be`^*%ZrPwt2@h5=tpofoxOMT{wVSf7 zi0DL`EmoIgicPH95F*FGb+llBy3b_^MY`^6XtyI`jae%N@=BE%ipOQPw;wP7gafCOd|5Q zPD6dsL*{n_j~WeMrpA0 zo+Lg+<2Pu~Mne~0URcTqdu>gSDx`=E`vNIzrTOi^Y@gHxc&T;)pkYbLRb*4PR->%& zu%rqZeGXk6H0_^pA(VtJO(?Sx4uwjoX+p$@rk+WdYqN<9f;N|W1MPkhlTvh+_F>gS zYHo3Fn9r~)!DT^0`e(T4{e+-@Az`$E#Lr-T2nE7H3hp4%uT#jQGaMnYVH@AzO#b4f z!pRc{;#YT;SSuS^Qdc3ostA@(L8l-d!sNs&Ew9UzW*2jN{nb5L{FvJpir4;#pdGxS zKkj!?Ji1^KID$-(elr_R&)kD7(_bwJSQ6}4WG>I1yEtcUY(h9cT@saweRgVRo$>Mm z=G+y?Ky#8+r^9}!!b}!T+&6{DU+)<7h!Dt7kN|~3MUwf>o@GNk=Yg9k; zo~l%PWr!Di`YYJ}Xf7(hS8(c*rog&uOJr5E05*qXwPk~4^A(8`5d9gpQr0_4W0(Z5 za`MfIu_ro6Z;OdU2`Qh%+6ZI0o^G*Kdk77M9z!>EXq*rczz&FaiescGF2bxgW|Qgx{=;Z< z65>Ie2HudXG#*f36Q#==b=1hLo~8VQb5g$suG2bIcF=+n2dsoF6;1(0GNc#ucMp|TQX(5h|EzdhXuU`6Yc7q3-qpqaFJ_p z=t?nR7J_26#fb<`sl=>jw?*Pp!yy_Mp|rjr3>3z{_Q3f_sRoGa(6|vLyc`QgatXhI z=^nJWqQf+DTGpbP;>Lw){BU_K%y@iTZ2&N^h>FN8j|3PvF0M15c2Wjt2b|1=rd;ul z?%j?I%~E3LXj^qHJs)gCxC}nG#kuv9LYo4yIGfZ88&%NnwqX~^i=tbXw9>ciE+|}d zZ7N(i1O@|z`Q{K1xZT@{TdN7ZglQA}B8Jk@5X@TU)|vU%ooktcM_JSINiHO8v|BhU zQHU!Me&Z2r8K=(c{+0ZVor1z(Qy1TGgthCBgt2|2mC>D@Yz$0rw)jXL!I+>iwR93fnvV!^pG`Ih$UcwaX0Ku$1Eg9PMvvYxm_Z> zyo-=ck&Sf4b7HIL#xg)?D9tskTFI zmsH`3wo1IsE`t+B`w@^OMUzrencQL=8+R2n(M_pJCumA>YHb~?v&8|Z7;aCgDW^H1 zpi1fPFM1cj7&v_s#5PYY%(-j{L-4I+q1~1*yQT#oT9g7`XH*p*XP%cZLTW-fCD;pe zhRDf9`k-dJO`#tG1lF(UG@RUQMxc4A+jNJ^n;ifecOWF@Cs%> zSfAuH?VLA~5Vkf&DNz#kTfwr9v9s!C!NI!dawT=>LJcv=IJr|pj$lUNRnWqZgl&?UW@^=ZIJLN7myNRev5&nFEUs1 z3bFlZAAqK^lfVXQT|n~Xog{66xyUW2$-O9#g)dEte>WpMVZ;Qs3C-#v2UVmpK+-P0 z!MwNy7?wQ2sCvYMXN@Om%)Xis2&l&`yuMy8yw-??*FzRw?@gK~dELKrR6pG+or^d{ zCLJ~bZBMnZCw7JPmQ=qbq{M$u#*){Q34Gg;01KQ=3R>@Ta$FOAL)pV~1OBitH<%F!ydto1}Zy>twpc9ZyOR9FAfe1)LG^cC2y3~|H{%)L&C~CsA zs7Pr7Ruj20D*xR9`1T-uCxK<0X6T3d3Ah|)F&pL>cw3m?je^6LM%EKCICX^}kQ6 zh!jsytqSNTi)X*$5>b~@0Zp<{Y-(pf=Bqb>RB9I(XhKl+rxYTS9<&;&^=9)6x^fMz z&KevKXDcwXEo+i(K@wt9k5werDZ1vptT8|Z-N=I?7V*(|o%z7ZXid1g=*5*4CeCc( z-Ux53c)(5t(a|#O58t8^Szoo6W03dnL4nXRsHt5>B%gDfBTHP}C;J?Uw=oE?fX^7h zCy6Y93e^VXxlIyeO3vVGOdDaPB@a;59r@+ba(=>lPhEII%?<}LvY1yRMY5=X{l1YP z%sng;++|$?cTT$3WdWZD$}djLpTELe^>^mv@{Y(iaLvph{kn_X28SZceF=&cOgbhZ zMMiW`HL8g&z~Cvb#Jrw2z5oj&A`xRi0wTtB7(r;}-=z&?d!No<9fxP~BJT2CdHJH+xhd+$AQDpLCACzm0;%^n{UCZbN4R@$4V^Cv`{bU0X=t=PaYscLXw8T_}&z>%LKsU zjFjDCl%hV75-U!mF?pImD5pcgrAOgXS#2#tlSp$7laTy=`4U%ZaX&-`jis8%gta8F9AeyHZDp%<| z^5hL28WRO#S_*3z?hgyUkL4Pg=RoaGw!}*_Yzw(+*d%9&^QM=F1!o!wbFM-4TTA7F zF0cr&zXa!@w=xYW;zTD*O}ilkMb3>}u`w6i-4E_@gEaPtseBa8e_b&$mWQhXrgkPwqr9jbZorF;vV`b71i zPFL@GwPOrr>r%)aZf-nhvt$`8iyWF+XJDtf8nFTJFb(QPq8bA_4czX%!a$)kwKB5} za$*aNv^34`=f9MWoR!(4NVyI^-b*!<=rJfS%CJ!9}bzK_6NhVpZc7oL!7b0RD) zyf}<1v4W?!dF95KT8K)oCi$1Ki9K@FL6>f^n-Owa?dYshCtPXP&{D<`J-VJTMo+IC zZqt%Uaj-2jS=*}|6a};h6Avlc6hYv*ns%bvX^bcx z!6cVfv9%2b&9hK91Ea$?LB%e1uk^Lb&J4@?FtKnKM9$nGAJ|#v?e&^f;JcV;9Ad$U zH>sA;5=h0tu{5J$tr>;uvAVii1QYrX`EVC%U5Al}E)Pm=Nj=iogqwMz2U{1zz=*Di z`gsLtR^BSH0=sFWYIjU-YiTW(&4B2e41IJzacd(?`g(LjJ6v?hmeKWI0>~BEm}+C( z`Cf}0^slA6WxS`Z8gPqk9U46b-3S>e8z}HNmuneWcmexPxrW4yjmy+mJB!n>NEEU4 zw-9Do84Wxm=(f+;+`_2RnK3AWbt+!gKC0tihAc)e|I~HIV&*XNOf14f(A0Gy#9j zA5_&0AZly=a{O5z2cYrtFo)F7q-{)&J*GBi615t4i)N!dBva@*rkR>N(c2Vgl}eJ{ zA@7OVYIxE$_Cp+D{UJ@GB)k&RcS6x~!)i4!d8x@iq*pOp(r;4Qb=6JWF*{hL;3AzUq&YTol1ydQFv(9z3mcg>xyMH&^zNeE}Mcp`Ag}d@5M+f<&BP&37 zB%B9=R`o)VZ~YH?OxLh@vjZvUw_zaGFcxuHT3()}s|i>O>y#RdYFArdh*K=4WIBUf zifM=$LU{a0P`n?rQ}6r9A~H{y3XSO65O!xDk=v=)Ih=>8N)Gy2z}^auBH-FT6yaZ# z;(Dmo`V>{xS7QYW!#m216qhpi{7yV)i^Q*96(_nQR$$Z)yE??;x{}i-wIQR0F~Ep| zg`m4c!_Uc|2f=Op-Q&M|wUro2$LX7zk6AJ{Qm9YOR@G%`5?j#7*ptb8SkqRAvcW75 z4hfk232(KLGi{sIM*pF5=}l;EDq-H79UJ2iZC|Ql#7hK2F+#QAB=E(9mdBbTYqwNK z$yT-nA%fuY&^9b0Nj6qqr2{GQ!e_h{iR)Z&(loaQEr{6{smY{gzu*hKNp4ZiZcilrLTma|6wLZG1 zskN~1wcl}Kl`9Q|?A2kNOE!3Pm5X|93p@zFuC{k~Mv&R+YwbYS=EmMK+ zcBZ2?Y%W#=q!{%~aIUi!Vw*G&KpQbXjF>hJ`b{ZS4=(c&cU`z61-T?6L6X20@@QG? z(KE&@o4B))`^MwEctZ-b!NCP{>~Y^BNK3WHs*+Y?;m04ua~wa6o!FEXWF#tgi%oln zi6yiFqf_gR_RUu#*EMZ2JL{N$AsBg+U~?e`lbmaQs1>g6i0Q&N^^8TBy@st5`IsV! zEzCV-BxtjJ?VZX&SG(xf76L6bGhBqn7b9u?l(8J5S$3`XO8)w#{L%Xw0EJw@Mu=}N z#}76?{#X}r_)84<=I3|&FOP0XW_@h&-s-t8JSW%J5`^zQy?i*sQ-1v21N95mI0njg z{pd~zPkBk0FxV>rXXZq+uo=36A~<4UMpzcx5$1VFwnkGV5WV)>oLj!wI^?rCJ_koR za9}(wSoj3PAB?CcM0i2Dx`kM0P1EF)If+Qt*h*_8eSujR2#dbj1Jn7{0O<<#@{5s5 zQT>^xPfxLjp?EXevCq@qK23wz0IZthtZ5rsosI91&pYj;9;_xGrZ&q?7feh`xTXVn z*@;b`W7kKbfv8kR;j@$t}xAH%ot5dTB8KNh0f_<`o@c7$?JPqsp!o2auZD-3z1{G%<1Yig-B1U={45dS= zq3?dhQ2V@TB7QAF%*;iUXdF@tGLtU|U}MT|#m#-|3!aE{MEp){_;(h1P3Bd?f!xaJ z=dbYkSHjRnE*ztF0Mpkgpu!Y7I@PUbXszK6rOgCo#zn(At3d^jjzg{bOb;F4N=Afd zQ0o;VER=sNE|o@jXG%xHRm|Zq8?C|*U4XS5l>J^bRT#pA%`?k7JTs`q^q7_=h30~m zbl#lC2&Yf)3~AHS!QMF8Ox#I7t3iwmbos%Go8>_xyraV~(>_mm?Hf%16oK%N?DQ+{ z(I3We0I|VY9#zjN#r9oOG3peSXoNnGJ9{=Rj|-cgkZ|u(>*Wb_&Yt+MFDyzQqZYnY ze1Q;V7$#m@s6GyM>f|o>?u%B>OSE;Yd&8r^+|V>ICiUr*7#ns79=;bE;2fLxASCqQ zKJH?LD$uD=)SUO~&wcvyTHXt}7k3}-wPN^=ON=DxD|t75F#gKK;mgoWyq+PNLA#a@ zDDVmnw1d_GGM^>GB#I6>oQubptJ@AeeId9GMoaS%0X}I1foqg~J>wnzJm9@lq2x>@ zRd!9QqT8^?+hL_-K4oltS3}LWF1Gh|1Ih1uVRCQ6WW0|v)#b7Vg&R*LdXBfN#(iTK zy*G87mX+GYqUm`Kz*u4C)nWjoww1O{dHx z=1s!EjDn=V0*D~=$fX->bj}o#;Zq35tPf`%a8PIo^{L*&@H;`K)Uf#s%rF0XJrFeLborN$`A?laB%EW@y?2zvp%l9q(mOdoxYCn@V5$ zsK+pfu|W7$`osB48GpdA>Ae&h;2;F%Mp>6YKqm`f85efvugEop_vY`-egK<;y~q^( zXQw34=)ojS)t!jq4p{Un7xX8DWbw9n4RO&rVgaNI!8PZ5MWSkj`vRzoV&Il^0S!Me zdrJ$pEAbtHm6okYWpRjyxLcF}Wr+I|6T*}MyPmpuSPs_&cvazRJ+FdU3 z1pLI*fUtie1Y9BFCeM4)A`h5aVh#^3i#exDbumzx44n{INv8*QdckNM2RGj$+{r}q z)xg5OY-41}wr{e*k|Ziq#MEmaKoSbNokz2z-NhTZJb_V=5UzsLL5`|DVj4Oe86#ou zF0jZ7i(l3+w+Z@}=gQ;FHp@7IqpcE;)${RE7st%k^$uDJG*l!ylgS}EYGfduau~Nw za`(RzhRB95TEU3EhnL`b3JF9MVh@UdUNc9}O_O=Jv_8Hx4UTI9OOmEHp{UC0RC3=j zbJRI0ZE3x_YnB~M`w6;G%FTX40rX&51)17tR(25P=wAk0NoRIIY~H6V&g|R;}|l}iv$6T zV!pkW*qc8^RSQFH_aR1a%zvd>JQm1mY$9cCBQz8YyUaNbTXiE!Ln zK0UNG4_jzl+@=oGW!6^!>XW*@B8x2tvH`>or-nF4v`qW3r-gbZMNDT7HbqZzyS}Y! z#AcZc*jYi6%SZpm@LPd6AOj3F89!w38IrmUa$lGaPUtdLoYaI+zEj z?awpJ_U8=&_Gfw?ao^)7-t#cL^=h4i@#15ts;t>8Pm`QV3{4FL=B=SiAkro(w-AJm zJpRGah)CK5Gn!GL|7n~0+Nbav!QBA;gL9Su1uaD5--}Q#bB)rJK(}V-?jTPX%j}qX zalL2EGmoRDlyPJw8^hSZDXbR@_Dk)EVBKRJilY({6D*;@f#&%}mUV_mI_u}SbxyMj zY4$7wqcA<68$n-WB4!yxqe~cc;g`GH;bwhAbZes!so8-dA}eC3?_a;95+Vz!{+wgT z*Q?ozuI6-=^M2(Z-fRUG$#dsU<`iaHcKF_X2eU=NM%qSLrxRrj)%E)Ms^&KMS<8yq zva+s1sJ`Bqwx_*{dDh+yL1JQKJq3b@yPw^2Zc=u-=#TVv&XOi1h&U-J*#$b*H4n?@DuhC8+Eg0qTXFQmt?AaQlNZe4>GL4{-= zB)g6xL*cGt2C>s8XNL>cOVr+%z6=x>cb>!nR^~wWb=)`#SM7v!Wp^D9&kOBL9t9Vx zo_DjeOX6psm$i66xL&j!H}yi{hAkQ0qMN=oA28eN19RwY=*FSLX-V_YCGgnRMa;NF zL+KZK6?%xhA7N0mM^%zwiPtx!#`9+inLa`>H7$z3(w^|vIbQ9cEdGeiDM*QSzKRSH zolv__lU()p^lE@!Ne0O_W|!`7sSkLe;)1ZKp+FH?t`DB;ghE*AIvCSFnq@%9mO20v zz5}meXpZ7;PVb$z^CZrL zVl}GAar5h(RWarjC=;KY1{GB41Kz!6Zp(ZpuSn&+9IlOw^_cr7*cwV}5%Pddv{EOM z_Ehb z8v}AG*`M>gBXl&F3%wh$e|)3o{uUFNX)fy){cg@p6Y7i#YPBZKGC>gN8oJ*F#1d3` zJKmP_rx5`fmKisV@ezQiKt$1bbbVxqep-v6`6f-u+Hhu_DXeht`~ zvrD>_tQXW*tl;+;dOf`<1v7#zXDyA~;XmSn`zw1}1llmB7v!{_dB~NxfC#(SQNFmL z2dPt0ihYTdf@<-y>w~Bb#!Pnnw1&)W9ibK34qLv|QNE%=z zd)-D&vnk`5}Squj>RwKr({iRN|52kwk=r#9CdfF{_FlMoEl;SJT7tu9@Oo{2Ldb6Fqy8&>cD024k-a1y4VR7dnIRtD}Z`;h49ibY_y$;f3K zeoiV_I?J{!vYQEEhJ2FCD|EOUJuBC7A(F!CUw#Q>^=m+?>lF667k*8!)j*88W{SR` zA?ZcO78-cK@>?_IR~J%)i@ zZl75dh%MZ2tAb;Qiy(NyjE6Swh)4b5K134Je4v744yfDHWgMZO5ZKy}j#8jKT~J`` zi11ZdP9k5b6)@|vq%nUpy%CFuWOcCwKKP~aY5Y>^Q5|R_Zwav+ke+)!*+RgQU_M|2 zmz0b4f$RO&jl`J{JG!%i_2*tNNrWMi>K}fCk(u(!Pqb%}TvUzhgq>m*?%&P9KbyP+ z*{9_!nZQ@EWX7b;7BFrzIBf-~Y4nDvof&ESrtep!>oSi7+nJLvQC&BPK ziB}xqAl<}+rbf){St!%Q8yTG-j>%vwN4J!D25yy5Qu66A41oV*nc2{7^1``J$aR2# z!wQA%YaPQDbpl>T*dq|WD;+ByEDvbvf@%Z_AC77_31zSi!B} z0nmIoaA7F1_WBfrIXiRCD{bK%OJ}Ca6Y=3iQSS|&9>NZK4$Q*?bg`ANcES!o>TvsV zb_f^7OpMv0Fdx^+1DR@p*+3V%fzb58DI}#?6}E7ljJZ^?YYjH-0V~Vw0L_frc!rjH}eerarSPVax>^#G3m7<^f ziRqz?61{E}#cMukexB8fM6G7FR;c;7Q@H156H!yD#0J<+-FaPEryUAoGlayI1r;;3 zPNc?D2UXEE>B`J91MFFCa!Ce>^gO`G#di<|g70{1&y$fzA>Tq1>BGB|8+@gcMu)x; z9%vhFI}+R>_*4jyp~w`802r9Gu~jH+q;$ew2*&C7m8#g(xU}x~`~6z;O@aI>+bA3$ z2}tZymVAU4rUJ4>RRX*4xC+83BRB;9P3T;GeqE|!)5ort(Oo>4i?UO7cD`x*?Pi(r z<@P(RP>~{SI1D_Z*+G)yx1<-8#&lD5Kyv%hmb16hCDBXj1+6y-_a$AAZ*BP8@@%vx zT8t=4NyHs!?U;7;;gulcX+94&y7?lyym})qGZk&0#*qox*=noQ-tSw5Fad&G;4puV zQ#E{-;M$|oC_6NQh(<#ORFm=2HAJ!hvPW<@Y0f#>^iutmK}9Jj_9+J2Odo<1*r}bX z?3q3Tk{;o6jkPT#n`n30W*CD{rfYOy^R3%mLpI*5fuJc@ba{s7j*jzVSx1nKqzyQZ z6gqX?L}ysL+!T+t#f6_cJKkDI3PLNZTZsiflgZhbp{%6EC&UOe-R|Mfs2D$UG?&xp zCf*gN^cZ10(MLhaIca>w9Pt$Ck6o4Fwu3p>c%xADc~xTjC}ATrP>G(I)V` zf4T&w0|a|YjfKi$_h~-%BFg9nSkA5bS#=Y3;y0OlFk6_DS%zxU0?if}{K}AINZfXM zy|7|Vag=o#tOkW6Hj;Y9S#e)N65D)x-YLxv^w1;iqUK=@DDxImrtzX8i_VuJ=1saa z)V3g_>oSN#HPYT{%_pyJWI~MtI|OR+I5wCjk;5z$4D_LY2GGCZ;RRRS6u2^5-$2x7 zNTpkxDnpJoG>bab6M-WWokU@Do5|=qiG7q4k7QcPz;Vd>V5V1ReNEH%*C@uRg0Tb7 zAoq&)7}Y^S17I$DLudTs`fVLbk$#@NhSLf<_AaE0!V}55&|GtveW$1_IQ39z5@4!H zEFmzLCbPFPhz#Ck$XPm2f>}%vISb2+V>)8V9rfqxHSRo%d&O<-^_q!QUL>25I>wb* zEpJ$w)HyXFK1OuO!1pv%xh;bQxDU2{m!@Q0`$=EIgt zKC!2mQOsbMNFj@!7i-P6sS4bNFOx2~Gr|8*7a3 zWCQLkjAAdb=iB;L0+%@XkAR6Ld!beg6djl72-7aYFi_BhsY&w9T%lA-aNH78A|eAa zhS2E2ga>v6)pD*Vsv?7e*66}W;ehOgFg8=q2iLi(%~c}F3}Vj)afUsOp0qcUV}ePS zts{e7);m?QlDF5YT3vtQE4_J4tFhjq7rh%+sj#kR45rL{pSmlfDB^XglbHSn95f%|Jg1|YgyWhn8M_GgV6RW7gKOlC zTKK+emRK!_WE?mU_mbxb^pTC3TtS68?NgBAIhH0(=L(kIpj*|BE|S(Fdk{lAu}&-q z**Xj+WFOC4AY8o89%E!16C@E~&X5rwi)DacTC!A_J!C0wE-P`-LD zDKMB_zkC_m6{5qqr^y0ks^v{F0i1yCSo${(LfAZ$3~dw!C67Qr;uD#Oi3RJ25IQz7 z>^AmG`5Q083Pn&fl!@uW{q?TYdTFwpb=IG z7Ux1e#}xE}&e`W}VK6H&=IgYUT_S?+IcVWzf@+YCNr=rwkx1xUek#{zZ!mlr2?5UR zSB+S~2v@5nG;FfjP<4q5ZDoxpuh10aMMe=IqXf5FI;N1oDQJ;5?=^))hQ{)e(9%HT z{&eLu^P~nK+05e ziZJUv2HAbabXItU+9&vDIPR$&Y|ileb?~ zN1>g!?vQ5sW*u9pTH-4E>FCF#Giif5ufl^RY`IzzAVnT*gpt2xK0!{dGp&*hbSRy z+lxukEE0QmvNeLZGm#BPdyrayw$L_RppqUaY!|siB`-FLJDx>qMPZ)l;f3x8tlqm_ zy=Qb~ydPfHW9nz3HB~b=E4^7#GEQmHx~7$}k+Mlh;wNlBU=Nj@h4NVBhb~CGEtm(* zJ7T{^glWBOtUzdD31%W7xMWIt*)tBYz=&Fl8&D&Vutn-XV^5AvLgc3Om{ES>uL#(V z+HX8G#f0Rkk^`d8RTnGK-G>Q??Y>)6FfK|)9=>8fk)eL~OD-Ov^EkmM1n8Ug2ttqe z8nMXA3^nI?^HQ^>)ow#l7fmHY!GYueCOj`T<5?kHrFCIihAxeA07-XTvD`#@j)j0h zQ(*TlJxC;}Xe+!3LwipaO^{_?AV=|LL2}F>voYaKSq*GWge}d;nd$uFk+$6YpvQHK z6xPK^&8yle*gX1c-n@*=RPd&PRoMGfT2Og%x(X_CYA7ltraHJPV?+O=2psR+sZMplB|xz7GMv}zSoD%rcYSsJn;Rc&hPuNj zK%ACnC*7xGAAOF12e~&=i49%{l>EJN-$I{GN1G6HhgXCulc=6+iVuQn41b!Vvv?7z z@ui+n$nubz={3U|%B*U}VWt(O@U7Tu>+#_$B(<^VDRN^?vsoBzs8vRR2x@q^lfzov zu;Km}`G=@ZLne(8cm1v;t>mjYv7O-}+%>NGfP#?1lI1Ej+SG6vl9yc1?=I)}l=FMZ z4BAFn0crhvkOv^*2Nu5^dXjaA0O@HUdn@GT^eopj%X=i_^4il8ixsRsmNOdyjJUkY}Bo#1T$;=e5wj%TI)N=UtMhAS0?TED1wB2 z>m4avEw&`aE#G91E}f{S!y=2^9@GFtry*iZ<5;$8&fNAIhE;+z5HY>z_)dVT$Kkmu zn@%|vy#hh-XCT%9>>_izl~b_Wr*wtH z=@Sg0eh1!$z+JH!V;a+>!0Lvjl)Dg(7r`+fL-+d;NG4<_%f==+VCj zq2d$9Ia?_bSX(HXx=Epzb!LF+BRfD-Wu26w{=ka5 z5-#^+2P}?nq`K2sN(bv5xhvc<^r5{A)w%0grDx!7*(RB1j}Ni4XhCTU67k6H^iqP( z=HQV`sgchm?H9~O26Q^f1`gV&9Efb}HT7wpFJol9lc{XaVjepYh!3H&i8rTb*;aKK zR@3-Sc#p-NJC`wgO0vR|Ziy-ggT7LLp|ccyK0cUIkf{)wHa%aRlxIfRPZ0zMor6!i ztPranGq*K4CSJZUEt-(M>!wAgYku>!Ep|Bev5p0PtLfCX?9r6e-CiMu#?O32j2-g@ z%7_`~Hp)c06AZ6a@Ug9UY9_i4aBN2FvTU}Y)?gjs8!l+6kiRFcrw_Or%}c>Z9o2S%UIPLIjF zWN^Wzh%t#PkS)Sb;Z)~L0b?5$d{xR2SGKUYbQIUCi@G*b5-DKg7km}ba5YueLFGPx zZBOekcU3w=HDZd}&H{^whecyy!$GLatYQvSMnrI{$I%`?Xg|PvQ9|$ot ze2{C^2lo^_y4;n=#_U%Ys|O2Pg=raziymrR%_Q%GW9DfS;~EIR zjWSrzUv%DjD+PGd1W7;B5~RvdD2d^P5l8I@@xrdo9w?;QoYYX4WF6J+D%w$6X39Fk z*+{MuG>Q(B!Ef}w8D=1nvbnex4t@0EW6o;^{4-W3;P7kuy*F4}b z0n-y1;oZx&Dbg!Q2xgfLrP+CP4}~_C47a_}!kTwJT9CK;n|JB?_aub{!3+bTP`&H2 zY88|Es_PMh49+(+p@u{VEh%!D-ht1&RuO@vEL@l^a8YE)No5fVx%$|(5wV(E<{Esq zBSsw-TS@a>6YkK1#}4Z^jF&|E8~cY1x7G1^$!sTAA7*Zg5!Gxlfh?JrxY=;!9NVc# zm^L{Sp-$e)uw+epq>RPA;Dtdj9BKAeEY-*%HLkheCQMfjRQ*gA7sh;>D@)J&l5A5u ze!fzIN>B=f7gq>K@fra-GI&PnpEe7k&6m(lWdRJb?%I;gfQjpMF0;1W!h{VvSP5$e zyG-+nGeTKuS|ak70#6UlG?pi}@JVP^AwXhy7r9P&s;_by3x|kmP}{M*$mN@Av(a)kn#gGk4>REP9X7v7!jyOUG}D;EA=S9 zK3A300kTu5_(B|hw>1!#-7p-hqzs}>vV|?At&B1WT5xlA!6+gy(UXi&zP>N4Tb?_j zjlZM}Y*Q5-*2Y{`OsA2x2Wz7d1hEBm5_ns1dvB4zu2G^|aBPktw3j0?tb0+?oQz4I zZdeimk-)`oyt75eO`usk@-!Q%_;L~Zj2IZnL9FFyn7XvAQ(2S<5da?a1wmOTm zg>l#@r1}d|z+Mppv%?jpu?Td`f~J;?aB>?Dn@3t%?|Fcm(3XoNvu!dQZr&_rE0^J{ zE)fBTVzecLE6EZ)9Bq*6taJ%sun9}C<|}tzQFJgA@p*GzFxE5+K;{-kc;Y3ZD*CIL z4?dvwvelwGA+T_R!^=nM!Ac{17EjDH>(Vy$D>udHOS34st{4Yji>CK}^&1nZ9ZQ z<=DYff&DKz%Qi^NNfrwoJae39Z8$<*6P~mHUW@1%lUx}C7cEE%1KLH3V;Kik^4`13h$q}dvSrAk1 zoVm20rEy-KvJc&r%TZ=@=S-1DxgR`vc$^#eprBUE0gK(n;b3Q$HUak^iTZT@-mRC7 zPUua~11zo9XLw|FW#)t01CfAh#&yHLb5$LE-CYFFB4rO>r*BSs=8to%yoC2OcWh!h z=nT%#drkfgBrE0#dO!lC6BCQ{?6m#17;KsvE#EtRICPLF=p*%0Ik4Y-=P&kSb5Pvh z2h&#CV{jsGgPFXGefkVEg+8pnEH>_oIWDrF$W!9k-I5a%^f=n+Bd2`2dfeN|I$VgWIua!xr_2<-fctpdhlO-|lPkzF ziq5mCq`U)teFAySYB@1(R;`>kg+*i(8h`IT8^82iIdNDfTPM!=C;px|D-p_xLr8~xEE+>vHb^_y4q0F_Bk@r0_ei6c@jw7_7 zzMv4-?I0}TYB>VZ@OY|ONu0uA89h&3q)Hp=D0VR6UiRL zNQ7zj-FJg_a^7hc^wS_C<*tJs>^LL~>gpaWW^_0A{d(P^mqsn^0rtsWvj;gbX5%oMs1Jy#(_y~k?eL! z5jTX&!1mY}_+FP)rh{RdzWPEHENm(zD0DRmo)9$YQs`(yl?Tn1nSo~VP6 zo4%A3Jic*@qq!teknZpsM$@Zl57GjnZtpB@W!jA`s3 zmyi4UoQ5Q!#u9mT60}rz5W&s>RNj!yO3?IEHzLOMQWLkILl*uzO73{UFD5?EzzLlQ zixy**X80UB!=7UD*ocE+fL!LU&tX=+KooRkUg~Dx*P5nV$uh7mfOz*B=rGdLpKO?asqZps1#b(wD^%?uj&-8`8zoC%7t0lF{8eLTU_ z)}=JDUhC-8&vK)Jd!{y^X*`6beArem>*->|-;$E-H^~h1lN}J^p^VYTK&ZtzY_@(G?&cf3)){#fF1aUtXujD}&B zI!8h?$F;*EYfBrlz@rFExDtJ0AySKx>^DIWCX9|fWwpcKaKFZ!4prJrQV5qM2D#`D zG4$%m+111`evRI;38w=$p{kyVkM1TZa*^2x_2ms&>Gh!*+4u<_dVN@b?-{~)ta*v) zt-}b8>zrc)J0(R-hR*0!`@4@7|GGBe)due*5yYD$ZU85pp6x`3P0OS@;Q%J8Ao((> z7Mwt`-ujL~-S$I+le}426Dk^3dGi+o%|^Bm$VM;Iau09U-!)O6051BR?W!5C8g?t( z(-opgaU~S8xqV?Zla@)wTBlO?#Y!!#Jmx!!KzE^Lf{>?v&8G4zbfb;gz1md9yWGsm z>AUtZ2qB$vf=G5o3WoI|dlc%C03Be2^kOFEAju+5qP+O2sewRdZi$;nnZh(xO;u`Y zGN}ff)`W_Pm{`se$PvFQsSn&^+3e=y3_JD3g(G?$Q*FJtAc^DtxC=qO8`&5m#l|b~ z!m{OD_63>{?0^SVz6Qq@C-KBWxMQ0dLqwgkl$5r?6jeY|F$V)C;gBUm(RGzhlyuQA z3BDT5%00Xgc$SB93KhL*PgA->o@K5<1ZC~SvgC4y`S^?z2CLBF`#F*xpMw|d@kj6% z@m=Dx9%0vQSU*DYsns6n=sK&;@8|Wv`?)oPeM%MD%#GKMK-jlQOmUB%?aL1B<<@+1 z23_~UM4y*Bw!p9^MOQ2gfx2UguB_ExomgTmUYHS}*$4{FOcaqq+ZJ#@cTqw7A^)7L z!UFG`0cuH5uPsEi`c*aX?l)y<>J@pPtoNG9iQo`BThX-{(+gCYc$qwQr?(C~Ja)<5 zY(WtRU2U`wfF|D#tR`*>5UyqrAjh@$vY8BBQP0Gb%7EU zEzTUfvkR+T)rB!_r_P_@3CmiIGI?6}Hn0(%XX>=jL}P$g3s)@8*0! zZ+-R?d%B&R?WS^TWR}(io{|AZ7eLjI%Vw_&qj#@>MK5kj2(7tA%0@)o%`+N)MSrAH z!jh|Q@>owH(dxq6MoApqjfqjIi@r|cz@(;C0#$}r7WZ(QB2>ohH@0`!WTbr&-^OU& z#~xy{X61 z>YT9m%*Ca9?^~^24^4!Go@YP<=wYa*#1vc)VLucFl=4A6_oApH^P&jl%dN)#zrBH zhZPzR*K*rP3)A#%)^G<-t$S)W!usfBydWkoEC!RA&W2QNrbqyrpwSDPV;8WvI?txi zKu*ab-{~}lE1^DW>lcIBtr$Ye+E>x6l$Ajewx8X7RwQB@Ze|PYSqs%T9UAWdqIvsH zo(gpE_#cS*MLregjY?n!u?umU&2A)Z}A`s+)qy&XlJGiaE?uY z{g7O`Wvvqb&c`6f+QOq388#nEHg6j`BaJrL&BqCp&9oG@H72KwiO&!Zk-`=!8B_Px zTuUH{ts+8cyj9E@S$J+4fuLtAxM$>65hoF(VKBB;logd*MVPMNDk8^ztEkX%ZWSXr z@K$i^htT+J6?f9ti)|GX(yy&zDm}baoOie7`7O&j!z$kD8&HtcmRm&yc00Tgi^~{1 z0?iCLc>11{Ck7*-ow)av2Mlt%2RzJ<-vfvr?Ey{=x$U$EIgJ{$Q-h+wrjN!kyXt?W zy{PxqY2PQ7;<9^#u(-Hz?@G>iH}qZ<$-efiK@=Ak?(zL*VM($A;~!x>pbAJ%3DxiB zg0mnfFD{%|o!bvBfb_Ep@>YFH#=3%w3x|9c7m@@lQDxA5apBmBLoVAHvT;~eR09V& zD9{6N%Lr6Qr*MnPTKS(z(!+IemcxPN1sEJ@E{$;T@cN<^BOUO869Xs$bWY2$MLJ!D z6o(G*ej##7`-8I!zgdKY2g%?hnAva{#xy2bSgEcgGLHcA0vWJ~p-o#So%oxpSN(Xlxh*(E*U}qD!kyS2;GlZ+h(vqFU|t-f>RrawKg5 z@*G*3nBQlcvkGyD2^(7SCSmX?$3v;sruAvNaUTe)z{55hQHY5^ncj@Th9S29R+YE! zt~2|PLHTB?)|4t_J&lc3U1lAluq)!)j{`$Hf%`{nuE`>kLmp0>)krKfWN4f?Bd^spDzsg^AAdU46O^kC|GWazR}tKA^syN@MS zX~i?dE-^h}KE}gX^%?RgT_tyFRG|pKu2sD%O{Df(=C9~Pc|)+_iG24xn<1UBy(X(b zTS!OsZBSW#l}c45Hqeuk71SvEBwE*^=mTtQ)__0>EQQ2i{y^~!=4c>B;}tyECu>d? zqb?t6lI+tFhG$RW?OulopFLT>F!4x|hRXOPXW%oG`D`h#Ec)3}KXVOo#{K`O!RD0D zUW3i4`!x^(w{g*6@4;v4@vYNbS?bp5`sD@keuhSFioCLfO$qv0ACO)W0fJ6QJwpLo zCb_bhEtB;NJCm&1GZb`1^p%BNk)&S$!q<3f?HNkAGXBaUu1s@eh9_CpRvIIr0m4a1 zM(5fdyCMn3z+5L8JAG4`D^iUQ7uO|qU{9R#F@|T!5dpC7OxiS>S7dn#HSBQFsdjfJ z=d-0l9sA5x+@HtKz%P=3BD8qsv}cCP7#0a_KT9Inn$GDmzUY8&o_r`7EiDf2db^HkH3}A|053bg>l=2H;o>PY$O7t(Z#M zH#xPB%Sa%>j$+cx>N}#%LE3R|Frk1q5h}Jef+i##&9tx9eeEYU9?^gTirG7Py_Dy~)Xh6%ZfHBKZs2 zQSyjb8uCG3`z;6gO9HgGoEC}6`g93RK+}#0s>~F&1|Sv^CJ45D3cHsKl-5|PR5^oA zYt+CAbitgTIDY7^kup+7`L`|q?I`+J$~EPB+&27I^LtI1#+7nId8q8--%aH)LT@MG zHRTR`kCf%BmdlOhXnCqUS$2$^BgMN(eSKLjPhYjGJoVfigq|+DMsIr2^`t+w?fPx^ z@~ikl4m-*nBTtN6Uv`W=ULGEKdgPI^YwTgdkCvk&Pi`ya9RF?_xtDa5H(Dr1-(FLm zDDQm^UjKKK>#F*0E7wxm9sE_@`MkWRTr;W`mJ#Jp+a`$We?95$pk+JC^&^j!ck=HM z+|#u2;qqSozIVqv%k5=(WY@^kwD0Ni2)`R6579!}KXR0|s{&8!Pk9{oC{Xp{#>nI4 z@zI+`l;6YU>1_{}caiELa(Xhx~v z_r#7Ho~!=9rtBIiKp&!{$I0&~p?mrFaA6Sn?>+whD8KKfzaAwgdfP2lY$2yzBTth4 z2FB@j$3I5fZ@TK}HFwa*s`d5Hy_Y!JK<_?GO4UsNG^VHc?lE$?LH;rI;|=A}vE{Mr z=?(SlQSw^8S~c1zkB_N5{ipKZz3nEI#@u-?fA1KH8TMYr|DBBNE>h6$9UH`{2kE<) zK633%*B&j8j=u9M)ofdNh;MG9PnXMMBM+DBw_Q&!+(drYlqbi|QI~Dy_D{OETt9Y> z(jTX+$42g;c52a0%6;z*Bae}TYQBql>p#^*wR_6H8+>;SUq0#34gRZ{dX47g$Tj5i zGD>}TYzO0CuDZ$bSGxz)56s}v9khnoGVz{DicYv}#Iu zm|ohZc9Fv=zPnvL$JbA~miJOS{UeUrVc)>N>*Kz?PKrc_o=a`_zkBPKDF%*zS%|FcQAKOZ97W7f@}kRH6>_u9wp~@ zF}Ge!uE#0AY`c+~-cIgXi#Gv%imx6WBc}78>T!y%H~8YQ@+9M-*-Jl;K2EBefIcv? zW8~C`*2^jW>FHy%X=fxDEcPuVTFQ_gelvQ0^VuHBx{+O)Zw`^Bc(Vc5176s}=DO^)8gO zV@$KPFq7{f&!gmd6LClRcRlqfBg>RU3NYG}d~walyNG|pHF=0xbps_Sf6c88zLR^H zzu^}&;5CgxnkfMfzrsrSkm1*;GVYN(7#aPi`SxBQJ4PO(mv4}dnmj!UcB9ADE6j$g z)F;b?#?PES@V&%cT}Iu)tIJ4vpE8CkxRLUF;4i>EAK3GmZ|{qLv|NRI4*86h?fAFj ze^|NG!xfP3Ha0pxof`CUic z2l~rvhr@o%QFCyIs;XWAO^Kb>HJ@UoQd9-{8kPpRu z814qreK_tT_+mS*;FRx2Qs#}MSK5~l|54<&jT}B2xYpTAiP_2T3u#5cjo|+na(x-0 zk99fQNU^QF9QSd!UAW!2J-EHp{busJg>P=<+uQi=x%h9VMz7%ekH>uiuur6RuO$7e z$nTSIcTiLH=RVwi!Uu2%@gJi0hxz?D!cpIkWK3=>M+hIq9m8FVyN-NcO=~^?r&f*7 zsyk`XaeDOx?ygSyllV{JUV}T0yAC%_55>4`D`)WEjXR6Ghu+dk*zPvGpxj4ZuO+?8 zz909=F72g^?Mv~!lybM1*ZDiutCZK1W`NU(KY*K{PneX9WGR!Ro5FD$HQ%d`KBml& z$1HJkq&>&)kTH1!<)0^h9@v8Oin+1Kw@bj58JXvJbYAB1eUR@~fNR888L{U(?^4$A ztpmSc_zTKKzS+QC0(KeqDa_zcWn4g=<bSdnA+zO+m@Qw-YYF-iw+(jsE%uf3qFj zvAujF?wfGmjQbYcx8lAH_wBgHao>UaPWStb<-3^a-%VYE-LKHz|HTUZ-~9e6b$lo8*GRAR@)n#h z+^^$)1OIR0ehc^8xZfdxW6F%yD9rGaeoCy_-io2A-?+?+~4B<4)^!WkM{um2h#r|?w@e~jQbbd zzvBK4_gP4E zYiYA+f!(-0xV?OL^T<)Kb>P5T_~usJZKQom_RsD3Uoo<+eEf*|nHfp=6LGKP`&W%T zzkCwu@4)Q?wjXx@caXS4zz*Y%;KT(yO+Ai{94oILImC>vxNdv7llbGf6S%u@Cvm56 zufd(hjr-f}8(jzTI9v71*ay z&rc`+A-mhFn*OYN;kNQd(rli`4*~lO+-KrG3->16n{l6w`yAZExX;CX9`5sTU!eA} z!+s%sa0~t~0#@r#_tc}ehAnP$WWyJpizfa+Q5%){D zUnVcL{a2`y`r&`!-ZoO_ljhO(^1p%oD(;=QU&H-6?l<^GG3E^0?~*A3+lN5-LK#;Nr<`@xy=N90-Qs3Bzr?F-K1pJ>=W zrkr=-{txa?aQ_$gr#MlTf5z{hkK7IIRoC?k%3o0ayK#T%F+NrPih8M!{+e?B2KTpw z_u~GJZ?!grm$g3r9`_#HKTyAa1i$>#$VaokZZH1~>|b#Iio1>PUPG<_ZDa(_W2F2$ z?muw<5BPuL{);sKjr$)Q4HjBwpZh3i3C3r%=A-XQ85nGP2TT=d%Jx9y?0+)2>g`@Y7!)SRw!rRD0 zeeo2OrTB*0*YD4_*N)!DifjAv14dt4t{c6vd?4<6+>1tqXLgnk8daa(Up|;`qW_}4 z>em-j#)km^P~3-6_6>wT9QQZOUEz<90REA<8-dk!yafM8k@ll;H&MTr;&$Rb2KO@D zOQ`!rzWrFfdpYjoaJz83aeHukaW~^`!QDz8+Iw!}_jcSXa34f_KYsL+%O{Z6Cyu_R zyb|{++$Z7g7`?abBh7x?0s846?hyGbQQl#GkMPY=+%ep%3Ew%Yd7%5a2Sy)&(yL?A?f=;_F^a|LD9;3p4$JiD8_LY+`7%2?U*<*^%DGXV zjv8GmZy4pN?a>FzJozk)u9U@5ZnDBH;~vDV;8v;MDO$9~?>g=R?jmjjcL{eH_bIf! zj`iO%sl69a$4|qFX8Lq~--vq%_Zc2a1=YB z^FNn#p9lQ&Nu#;>1$_TT%J>P!{R?S_=IIv!`{Im$gmzs8^h@~WOM!hE?h)dzgL4u5 zExJ$jM2Qoe>i zUpuPr-?m9RaW^#GVey`5*jrPBRTtER@=eTXSmycX_8Q(Pe zDa36n-%Pr1A&)2@?TE5Z5`g2ZF`6~))Kg<-7`LexQ7^n&vYMtC;5Jt^P}$kz69<_b^C6^-vqz< zCUSoh-+X5Ip3%=J-#hwQ<@<=!JklIma~l@R6O8o>`1k#c;}gK%iu(cF+i*XK`yt#9 z!Z{VeY1Mjs}X;z!FnaNm#ndE5o^`vrcV!u=xYUqY&1 zV(tF&=;uP;D!ph>mAAe83TZShFM-qS$FYZI+z`$);@CqO<6kwLeUv)<+UOTF-~Bpe zO;WbzyVlfijD8`#73KXVW&RfKw{gEi9#7+b*LiI(zehg5kNX4M1^VR=f&bCy7m-7> z?T=j^`=;USo#gQ+qhHJ%Q#^a9zk7r-BmAd?|BP?c4}Z?@U*O)2`%Bzk;r<%;H@LsW z{T=S_srP$u@1VqgAisaa{S)DT#;vk9{LAQ zKGPVfkGGZoaDMPi`2UkK)#v{;`V~2THrxPvgc(e+G9q?rfIx5+pTsJs+WF;$bz{v_Ainak+>5?!`&=bRWO3#obT4J{kAA zvA5x{BA6>V>gyL@;FCXL&|*v{`0v1ud=s*Zz6dg|7SO8(k5xr6n87` z&f$l?Vb?&-eF-*SoVj^2{@`v$JDq!+l%K zcF-PD@^xzFL74iPd-2}^I&v-T^fls);5s%VQD*(xNL;4Q(oXz>TPOUlCGC-zouP{_ zY*)-~Ani+c?0hrPM4y3{%__N} z!xlBjvXxmTs~Q5o!BG4T19|p_!w47&qhK_Qfw3TM*f`AbFoAFrVG_DdhAA)=ronWO zcxAk820G8g-wDdR2WgsxTR0MF3hvYvun0lhmkYiC*OR=w<~XS z-s)-r@yVFVLc;uxo{L~HEFsKN^jKyou9hQv1@}?h|ADy@A{hNMb>cnE{c6Ijfwf$( zgY}S*xc@IXlI{(bo!{wXRU3(C6LD_-KlR`n7(ZK$G{{)lE?=9xTWz!KVV+IutmNNb z`XN%EP835YY>IZ>&UzTH{llC#(pQGujV_Cu~Brt3ohL5(f-}{rSr3X%-05(_44~?`GMg_ zo>wWW}8SXG;E`@YRtp^$_`w;4wUbr|^vUp2G`xiJS=DU9Yfz4ePL5XOxNb zflm6`0g)|jn7>b@8}(M+wKC@NhA=W~7s1G}^poFOPBTU(d3{FxiTro)9`@t*!E#o8 zQ@fBS&&Bt$V_L5> zZtMRhrB6lsYJ*sOD2R@+G2=j7;*1CJAps;LzC^^67?MCzNCwFvg*BB5v--bp<(pOd z#Wz$+t9)-zzxXy09t8$Q*oDh$)YZaaDSSpwGp305A zjMd~p-Vcx$@*y`re)IE;7QieBg`lvJzWeG&>wQ(k`al&WZ920K#jFoiaqA;hg8PzI zw<-mtp$wFTa!?*BAY1yV6|Lr&RweFbT%|JUk#F-Vm@<}C6|)-1m{xU68AGdqSrckO zZKwlvLHdRDFzZ7Dk`$=x<>WJ zu8;Mp>T7+b`XRT!HJchhxPdST2E!1mj9cDjY~eX=sPu%NQ#Yh6%(TigX7+=n9{Kyh zy#LWb%5f-ilUN?}Eot^OhG9Qk+-OfmV2*@QFdD|-cPxy9@i2k-BZy}r*OOo}Oo6E| z4W`2kmfX=q_cv(Qtc3{_x$Tzs6>c+C(0QS)MQ#XH}b#zs34S zZMD8t+wd#nJlhGo0~tHH--Wpw_P}1)2m9dw9E3w~82?A`dld5+_s8J`_a~9PjyO(X zp2qDAoVC7E=eR!)ZPDohelNl$xQzQ1xC+kse|J`wgae1WgXknwz80!j-YU%>*_0IV==U=NUXjxk*9g1~{D6aOyEU~qHo0T~Yn z;ob|O0q;}{>?&awllxc@8{$A*hzId;Pk@;);63XV{Oz-}Q&KO@d5=W6Cx#@D6p}%5 zND(0KOLL4fjQf<33Q|KFNQ=9)rRjXS`{zxv9ErWbD-Z4#|yu9{2(BLO#fkKY6YSa9t1zfsA<+#{3bAKv5_L z#i4}w*JLfoC*EgPRTBM6L1`$1ds$yvq)$)|zvr2WbpyRM-+QEzDv!U0lxGFZickqE zLlvlsoN57aRrP=`sz$(9o~^Hh{pt&=R89QUGUOKJ{bc4_ZSLzpUD!`E8iNq^xR$$AM zhR|NMHqvQVZIICxo!a5v9%NN!2Z*AL=onztn290m2Ngj%{DMFE?lzxIyXwS!By@%@ z(AAKs^Q%{>NaB#eE!%hY2tdyGbyaFjMd|6}xF%ccJc2$9@LP z+hB+`7Kl5NdEWmvs{0@r*;?7`eiI`&~lo20E| z#ekdD1N)IF?f(JHgK!8A_PVs z{COc1Vn9rY1+i@jjc}5#1`r3kxDXHGLjuAlgm|)=?pd(U%5^r#4mltv zAhX%ym5VH|9rkt9fPg7`Si>EcGOj?k? zKXKm@_c@HGhuacUmsl&peQRh#cqy;8T(^Vv@H2$7l1JutIv`V?i;kF8S=l3Y5y<-m zIzgl@8Fig+1g^V4SLg=a@&7AwdO%P3tS8rc*-~g`f0%Y1_dd`Uzx|*;41j?!2>Zb> z1b*XwC=7$)Fak!xC>RZ6@G}<1aXlU;a6J)o5=@3EFcqf3beI7%VHV7WIryIo^I$$K zz-}S@j?NLJdl7bvVTmnFTMEmtUyl0qp zvue8bNo_&KR@i1srESM;2keAhup9Q+(rJ5wM?Y_Jo#_| zF2W_a3|HVPT!ZUy!&Xh*#Q!Z@ChfK@vv$XpMZ0Uus@=owK0JVj@CY8m6Oc7MPcfgt zbC7j!FG$Zzcm>QYtpXtkHz`vG*G_OjFr>uJjp>09JbNJ&Vn9rY1+gIx#D#be z9}+-9NCb%)+(}}WexOq&wP(|$4#_i@47cQv0{1XT$#p774QU`Pq=WR30Wv}+$P8H^ zD`B#sS2#H%>%+5iFKLL-a%g#t8J(QG1KlbIesV%CkTF?*{^#aC5BvZZsE?b_DK9ee zkr%JX<84anG~dMb7^;9h2j$CL3T}n)FMYT5_$kc&K;Gj&Vitj-AZdF<3COzDV(3{M zO2B(`ll3$u3113ILm4Ow<)A!aD?mm3RFmj?;r5N)+{p8Zx5^pmX4XCSpQR|TXnJL*SaF7o4tV69hs8mUom@N*Asdnvo~fR=!<gmb?sSCFV+2U^@R(hJ-Vp z!Ejb<4zx>t6w%`Rr+;zxujeuI>^H&>g<-zrJF>w7r-X zz$(x&+>85I7zg9+B{bQ!FoEldFbO6jcM9fIn1;Od%qUF9oB=ao7R<)a9NcBKh>Q(L zKF`JO4A0Fx?Bnqc=*|6nSit>4d&&P%ALKb^%?7$GvX{~p+udpjEVY-`mf5pv%VCAR zj24BgKVT)Sg4Oo2lz`a|gtKZj`G4kLR<*`1>q5(u9~HE<#`DJ5cXXceKIVEoY(Q7} z=HH092{fL|&BV2Z>#eX2wnI31Annf%u16DYC-=L^{V$6tCDk7X@_O(qndUfH|bkHzgpUa)-x>aOY*I$+ zs25M{BEO7!iu*J4evTv!;;xIe&0du{rm|5b*(xAFTKzS!$%N&kmG8K?B8 z^($$Wm-TRa4y6T3Kc_BrSL&SE?#Q#Q<8A@jry=V$B(JU92L!S%GLYUJ+q6dTTuGZ0 zi2XXFe%2$FdgMbr@`1hp{v6;07yc8oYTH2^avuzC@IVN7ArxXDD<;GWY@mg*!kf}E zWW^zD?7;e39Ec0?@Dm^Z2_PXPg2a#nl0q^_4k?Uy8&Zpu3gbE@q=M9t2GT-0NX4_5 z9{(ATn=!DFCi~R> zS^+2sg`hC}2t}YM6ocYW0!l(DC=F$xER=)tPys5UTP0*yCf+LOTb1i-P#tPOO|Z~6 zsfBxOuIoTus0a0-0W^e0&={IPQ)mXwp#}T|Eg>9QA*Xd8mf z7zV>(1dN1HFdD|dSQrQ6VFFBqNiZ3vz*Lw9(_se8gjp~f=D=K-2lHV8EQH@-5iEu! zuoRZTa##UT@CU4fRj?Y?z*<-b>tO?IgiWv+w!l`{2HRl=?1Wvg8}`6n*a!RJ033uv za2SrjQ8)(2;RKw7Q*av2z*#s4=ivfegiCN4uE15e2G`*R+=N?j8}7hexCi&)0X&39 z@ED%JQ+Ni?;RU>eSMVC%z+3ne-obnL03YEKe1d`JKZArT~oB#;!6L2^g|VUQA1L25_? zX(1h?hYXMrGC^j@0$Cv&WQQD(6LLXr$OAt>UdRXep#T(wLQoifgd$KBiUl>JZ$&z| zmbyQJXI}aSiP_;IZR{Mq1%0d*T(&Uo*9J7vN(434Nx0 zDpZ5&Py=cbZ>^x_TJ0eA6%ls?J7}yx>tMuFH%Pw2TB2J^>{=Rj_3$UUrLu<8zYoVg z+_0~YeJa|E20?DsFsKz_TH)5paBGB{d_ShLwl?e=bKk^}O}k`-Ys1^Ol_vJhg4#y= zY0iBMbo&W2f*m}vHbDByEx8Y;{tTrJY=x=o?KRm8(3en- z9?%ndK@>fVDae$adxZ_X>Ca-{2l_%k=nn&6APj=RFa&;sp)d@F!wBLYNjgTsXcz-y zv6t`iahT(ApMW_LCc$Kw0#orf4Y%nq17^Z3m`%RS!JG^8xSkISU?KOv!&~0>iwIwj zZ`Q@gSOQDAUq;z3hZPV7f51vu1*>5Ve%9i59j2^HUysZU+;4+Oxb1{pup9QkUf72|`{4lo590q2c8B2z9ED?W98TbN5>CNsI0I)1caCu9 zxxRp(i*N}pV|N9v!Zo-KH}HECw_9+V`#YFLNWY9_-X;7!xR3nAop2w(K#L92 z4uOvLT9BiI=5Tb>oQ??1<@lL?c_(J(q+jkT~(L+n==*hRa?11Zuj9ywQ zM{mB@XpixehP+4%=^#C1fQ*odI5HbDOg*x2pB4LT=$&2C@90k6^das($nAq%+G$5$ z=2iM~*_Zo%#6!DHnA{*^F?le5fV_|oxBQp|prAwMKKpBh90O>d1`vLLAy3w>7dCVl zi2Xq92O9Q2qDu&U>f+iU;vcLP!B0_0WgS9WJ_LV5@Yh8%^Qwzhj65su=%kf!gtE6C zJxO~>WRwDPyoE6!!pGuX^1KY!td&Rqp;}qeTFxkM*0f+&a10{d!;HRaMdVdN|H@Fs z5y>}HBymR)w|p~&s;anGi;hEA)w!+#HGT1<$IJjRAr91n+K%DG>sEE3F4Tki&;TU< zhK>Nx#m=mo6OA^#8*xmsi(FlGM=x39`zvM-=!sh|7-*Tq{LCbDn1l}Ic?rFd z(+B!G#%lfW)6FqaD`*|3^(XED#5vGWMBQfBq{goL?ChM(3$)JMJJlf4DrYd5bCl+I zx$H|lO8N&Qb4avo#{Rh;!5s2X%wgz197e!M^cw}Eu^$6t9h0DnQ5U&H+Z#|&*Pox^pGnUptUF6b1<#L@=xV54IeZ4`Sx zvD*w=U@Kv^!FI=NqmQryyPdELcEcXrtmNxn%zchI)ECyr=>*de)5RS@zy#*A^Ic@-*%p zEDPy(EF_N>8uiH>>o)7d8DyO$Z_YW2Yv&!mQ`Z-2TlERr1;Sl)EJB9dmsXb?i@&>G z;`8U}%C9@1p}-mXrmoPFd5pN(*qxy06uY@vcVi)&HXRfA2xDAwzVF z1+gs!sAFcH*@;Wq^+2bLW38dQtf~R; zt~|HFm~QYOFA{kn=pBy#L*R9q^J1aSwa8zK?rYIq_NK4nURM3C<6icIEa3??`x7yo z@*b7b7P~mxX$%jdUj#+C5$X-7uIX}@e>cf@~(`J zZV4bEBw|smJR6B|ll9U`uuBTbAUVjqm(1Cx;QAP49fp|_QbB4+18E^0q=yWU5i&t$ z$O2g*8+Amle?*5Om_;ErJJO3e zw`j$o1aXygKIBP~aYx?wMAS%a+J(1+{3(2wha)C2h@?a%!H7zl%$ za!SB%%3wD#+-flLrQQr7{y3am@tgC$GS5(QtD)!+0mEP`k)^*U>!b^7uFf|Lm@o6V#qpP`B(Udg@zi;ss z&S?ug@yu~ZJ7ebET=Ht3(;xOQeSNuR9?3{Ab4i#B4Y^_Jcg#h|T5QN;Z5rlM++{vW z_8tt-j!^azp0zF5FN5VE?eq%FD3Co3f8f3nR>5lLQKRjaypZw!dCp_JA4LY|jlf!n zG~6U@$D`fE|2p)M{Xo*Mif=igG1F~?lRB}+(D~$dcJzG=yHnVi{Nu zyeLE7ndrDSpyyg-N}Ta|pYGwbiC`lxGwo+6XX%5=`*tIKHyL%!lqKoCWx2058*!hD z)~6|9witHjzq6A(kT@>*;x_vlk;J)`yffFpU!?#2EuGtlYddl7fWPLe$hkz_62D=p zKK|s4m7Vz81-oGn?1g=>9}d7lqr9XYy-c}$i|3Jch5GBi7d@F*GxWcz#Wn0DKE@gd ze+2uZa14&a2{;L-;50~{oFT5Wa1PGH1-J;8;4)l+t8fjjJFofTmN@Xwx5f=a&+9yQ z^k+fVC7I`!u~v^Tw+wgbm)!V&@N@J3!H=ByA?Y`Dkaz7US`w+-Qjfwp4MfVN1^NxZ zUiK@>9>v?}BKsBFfYhHmgx{m?5L&)77%MUAidEgi{yya-Ya$*v?~?c8Zq~VQb&vY+ z{k`~={1^ZCH7h4infr$PdxajL%LBA}K)dj*J$Xo&vcy~t{RWdij|g9qQ#4{5r;|K1 z{F>=upEd4JjJ8JVuB?$X_mE2+e~O%E@El%%?8lNhv6o!GA|0>c4ed%<>m%AH8E^DI z7iRnR7TJHoJ9rNt;3Hwe*-4TB7)3{y$J!^Sv{TeY+~UwSrj1SueNV!Cb#mGVlTta+ zNplg8i?a+}e8EBh_BPm09v>v^A@b7BhNM8(V=c(_RCBn{&Gk&n$%!kBMiJjL&E=B# zp8I5)?Y88HjK#`6*534W=TY~9k$;yyjl^Ro%|%G7+r=0X^78Zkd1Mz|pJ^f3dC|+% zjXoOrAbYGsv5NsQAr{0&uQ=#>kT~KZGah#FApzG3Ara|H?24h1KvGDCU2;ePVT4Nw zsa!H9M4y0gXGpi9+bkghdoJ|MO*k`OUTJyI=?C-- z=OmlFq$eNb$6o==f=~zw!;etJ^@ciaHP++HnE)GkMm9O$`s`SP8(p9NG~VU6d7x1!*iDjghced*z_F<}o>l0>H%+JU%pXHLSFFb4JSy!_D zoT5~v(7UwcGbifE_p+SPCEtDW4OoV_${OinxhwAFTwk^FPys69RtYM*G+n-p18K*r za9bOxb@e^&>gy31`Ogzum0VLiTqPZ%tQ#E~j<+$DOJ&hFFU-s0|IV ze@s2CLtJuJKwZpw*iWEF)FSgmNN~ykGM&EZd4chUDQXtAn&KOTrPPEs4*xW1if| zHz%b@dx^Z(+()2W8^a%Ss@#vzT!wD#kl!AD203@917=5vAlxs|$rY>zA}5mT&d>$A z;@%Cq!>`c8bfQr``LiBV)F!t};}AI!dBp3f*cdXeK) z{iv(`U7>vWQ2!`1X(uF4WNm=Rl6?pRkUNmDgJ3Yoe#Rk~zhNJt#X#r3jwwvWeJJj7 zF3K?SiZg7S!;EVw?#u8eV=T*EiAjUl ze=kGAOInjq@60eeD9CV5dGg<{Fk~l-mbn6%QQ)B+`NNew+TTj-R=83``&-5RYFGnn zU18DwWPeP!O6jXFa!Qoh7OunJdLypX)B(|jaW(Gc+i4?d$W4nhgg%k<#rN{=FwYW{ za|27MO@!Ty-}9U{W!A&AhPlO+j{3+r9O1XYcKq$Y+zGp2H}`vBFYJT;aKM$`D9Wa$?7r9{Qeg3=Q_$bCCmR@n(gof*AL_ab6|WU%lBdm##t{S;}TqkE3Q2HRk#M%xxWE7U8ULk zWq#Mx!MsIWw|NiUfxF1NhoAfK03O04o{h)E|5>jcsyI!Y^Bu&nRZd0#QF6W*#)2=@#SGXz*h22dJH{` zJT=o)2%QS!=SR#UP!uwfgT=5b4kbYLyU5;`l3bU9(ohCGe6N+oEC=P`4gM++z9LlO zzA|PN^r#BepgPpRz9wcZs10?XF4Tki&;S}jBWMi8Y4e*9rYSUo=FkFuf|ek4E}VE; zaorlT4ah#FwwUd(YmfOeW(UlU5COkHCy2zpGiDd)3f;Kx4!=SV=n1{B?~U09`f}Y5 zvp?nl7zl%4Fbu(7_6YsP^-vhbeGC{5BVZ(qg3&N0IG;W?xPZ|HNZv}{Ehfm>iR1Nx z)G&oP?jr!G(2M|0(@b z^E(~AD6c8FO@(RDm}f)2A(){y+Nhww2)-K&>(gZR(=nqDET9?JecC7@e2Ed%YO;VQOh` zaXlXXI5 z;y1tBOnue`mqtcu{FL_jk$rNeAK3$6l~V*`sG@odM^Sw}Y1tq;JB#TXiBI-COPXS% z`zG#1kImo3FZ;u``0{Hj&zi)$Ex4>MXH?2rRNL{p9CpA?*af>`5A20~upbVG;5mBAyv##*!SzezzCu^oL-G9_&1?L=fw%A{ zyo2}f0Y1Vf_zY4mUogLdY%0+p3FV=?dB4y>oxxLORSP&cHKwO9i@gV^ughY@Sk{~ZBBy*Qm$sq-H zVUW^YOr>(m84GTe8Z(VMOr?c%ZW$|;GZ-GL^ls+X(ItTL$%xsD_9PQ#X2Op^?<|;E zAsceDyPYbBJBmG2GMX2~`?8##(_Kc-B8P zK`2Drh253(A2DST@TotJ5uB=yc%lTwg^yq2HHY9Xb(R_2h!4!v|L~fPXzbBpnoTbBwr#iJLBF3xsvylA&N_+&jUVHTp#@3086YjyR-)Rm<6y1Z}XWY@Zc zt-(99roIICytD^Pk+IB>qx0?xRLjw81#U9B5QRK{zwQsNSHdb-4QpVnTh7OEs&!ni zch?~;^^9+Z4TRt5uCH$bY8~;`H+0^N{T5$bTix~W-+(kVz`cQy<}y4d#=8U^!Z~?X zzCSXPu5eDD-R^FrC&r|wWXM{B%pE>iJBi=SE7k}5(o@4_p0%)||H;Qk_9g3E@iYWfv-kapGGM8D>4YV;q9&<@KvTBAv)?8oVBr1#Eu z=Nicw1X6!Yy{;qo2Hb>O$h{3a|B(jXOKv%vhi@C0$$RB4@t2_<-ow9qPu(ZX19T{6 zZ%q1{F}~7_ylqC_ntdqwmiy=Vrp*~=YNl`H+~pk9zlX?t1dowfgYO%u<8toa6LfnD z&)_+3C(!?en5?~c>25(k?e8-D;VBbze1UE60(|nej@yycXSVF!m^{{ik`_8TI3v?tcIN zyz=LNdp-1Ta^?Kbzt%-czTnUQlF$D5q@J1I;bz@3*E)E3 zKZkQ_ubH<0uA?#!FK1F+Fw)oYU+TbL^PvOv#*D{b2O=mj$v^)Ys4^dD&X2?+y^r0$ z{H=`SIq~c6&nxr2sI&1`##*I*TDZ1C0Nm0$`DFO(%fIELIJ;)VZ<;~BA&#M1kAk3swMUGr$!FY({Z|aGS491`SKk#SWoU5tf%lW3+&+? z52+wEq`@vNr1SLC(_?0UjF1U3dxq#)AS-0!KD#HYmc#R#o|EAUE;lL3T>w zU?o0v#HoJZA82I*bkYhDZ(;Zm%=rrTbl_(w69)3WSx3Dq zid!)#j(rIzNg8D>b}8&idxq;}JR|h7o{@Sv^hyV^ezrVj1&^$&bgPQ!P{}ijwrCW3 zjY2P(AC$Go><>dm6_D@8P^ijvHK-0Xpe9Hkq!y;E9ZSht>)IYU;e9l+Mk8yKUI*EA zJ!5E}kQ5d6|Ix3CN$wn5m3`$XJM(5ArMo(BEH&c?#2X#$F#>*pPM+!b z%c$-c>r-aX2aKU2k#E-VnMU05oh$w7_{dpH_z}DdI(udrad$E7{O>^tH=Deb`B?eQ zH&)vdM>oobPbBKF99-mYC>Fp!at%i7HZr-haquk5#49R*yDa)bwmGj=e zpR51t96kHk$&2B{VeTh)su4cD&m(&zX`vsmA)Cs>|bA8`J{L9#Y z%rni!-|wC%Bc3_fFA`aliJYs>I$xhG^ZmcrQ=DgkaYFojrN6!uoqK63nNyNqDp+ac z*)r0$99EEDYkAMh*@#jeQH1#;T1UpGdB?`Il-J`J`ZI=z`znyJ8E!N#37A{%MbSUg8u>{Z!Y%A?!x-}94(46#?!kSoA7DO&NAMUTNtc{k^n@~y z?+_Uakokb8xIM%Fb9lk^OUzgB8s5NL_!Hj2d-wn!@%IUyyIC(yxphIuFWi3x6~ft! zA&k#~1*{MNHtg*otZNQo4+r-SaAN1e3Y4y5>i2G?9*VE7Bd}YdUVQweMYV`L1xGTSs@!_ha8X- z7VvE6!f$TK13y4s$cK#lm<6C9a%G&V5N2Wc5o9c?2;qxDG46{)2`CArLQ3-XV^o{# zGEf%EA*Vc4fQnEFDnk{h3e})G)PR~$3u;3ht|fPd=WjmRyHJD`<^>S?}v1ZPISH!LBW|gZA(< zVa_o&)Pd`c_&rY@+eyn5LEgyw<`>Lyn4K^q@f*pVD?09Pake+yM3z}kW$vgYVLBso zgtmshs=uw1y(+BTCBClE4Z4G@fBzM;2lNDUAB)*`7uRwq8Gl)g9&+wUuaLF0W3pH0 z+g_jE#MLKc9qkq$UZBy#(gKsKz9H+4_Nrfqthn~;AnQTs`GEXhVt?Yh$uo7!*q5|{ zF-%!oL|_E;$89w-WAke?F5?$zw)^7VtZ%_>D{1Ao0Eo+sH@0tHc^mhCgzV7c8ew&{op^Q- z$4<;$up9QkUf2iwaa%~A>;TuHeA^r({2@5Z{Sl*X%KAvw%VKv7zsKPO_A|7deDj*= zJBiyVI1OiTKO3@HKgacXt}nnvkhM6MFfYRu+1Pams2e=*H$!&mxA1G~y2tQyJ7h24zk3O@mwTy0l0Q;byhHGN7w*CR zkbRW%KK$*&pH)4;&fLEs{`d3t5WU!wL;7PA-y`Cabq0@({NBiS#18#Q$X5L+_TO~b zsXrslQ#{-C=h(kM=1X`LvPXX%vR{7_azM{){F=rA;*{SbI7kb!M7<4>ccy{rZ{ATM#no5BaxlBnK;C=0m-iG{ApmS( zhd>Ad2ROk6!QciDgn0dJ9OAeRg&5x5jHmBXF}-dT%S*mMB+*I!<_p>G-#xs?k>ln0vvH8WN0F_#0z)v`Nni2O* z-b4Dz;G@)`qtuO~l#|)EX2wqzgL#Skw2k#P<*U;Op@_A3_-_ES&%wzJh02D+Qd8V4WpBmrIQkO>f=3@)tUYPKb*D~iM z^DIB2Piy*=MKFs(F(?itpd@}Hw3Ed1j4)xUls8P3Muy1r$5RGBWkJ@7mm^Ghr~nnA z5>$pNP!*~{b*KR~p%&DJI#3ttL49Zd4WSVT`%1Z-Aop3v{}0*U-0%3(OoQMHBV}_!zw0XxQ(kZ4=;OWj4>_j2#Bu*$ zbu``mI?At}`OEC#zm)f*f5lvn_KbEz;%Cg( zs6)@A@5dYOt{2gH(Vz6nm{5Gaal-i(HnU!scJj?Nz^L!9eD#94T%Ug#`xH0H_XtgX z1=WX=;VB`MJ=zCMYchUE2jpsvFwTOH(KZc;gAmaWFhQcuKhiJY1 zV<+Z(?nhsJ#V_?}IN?TstdAavISNJ_@qdbr@48WsK1a(l%Y|<+BY#fo8Kd7p|9r2> zeAXCbjzuTw>y5)452Eh`@Yj)vTu;J&GVRh7mFQiX??e2@wJ}vj2VRY`>yL1J4u#f&mY7s{j^QI3kK8Ykg?T~JUX%`VZ?Dvhani3v zAMw8qb3JUpe{szmJD2lrH)3c09!hF$6YX|Mr)CLIEb|A#TQ*~tmcIQKuf^g}@@sq+ z>}9WR25qZPb{1oPfOBx8Wy!Dev7d^3$gYj%e2vlQGujw)HTQ!`Th920H^A~bBsFL7 zN?40!C;rW|`Q=Q0nSYS8`{Sxz-Y;sm*J?S7zg*VT+8!_G>UuNK2g!ik3_iK6<2Ce= z@kUu=Fa15Y+V35Vzrpw$>>KlChamoBA8~!oO6jG^n6}N5j$aXE#DMhKNuP|dOaCB{ z1j{P)KN61s@uN*~xX~&Lnf86V^*!TrP4pt#7do-W~@0b&~ zo%9al=?Su&^4cw@y+M{Um}k9Ci#gXI`+?0gNT1~#{?AkX7vLhqxK5Y|%J_y?*0e5BH*voOx3RzDl@UzFZnzh@_uw4Jn96<32i{r2d6@EYED-K0A?ziL9$PF}nv&OhND&`+VyWIm7Y zkuBrhA22_{C-@9s@b?uNEQ+#dpoh9Fme62}HPmB~wZmpxV)g<5q)^_`UIv8Hj}DbG zsH^Oub&WmEfua1Sa;U6b_E;k99?LaM`PPuOK-MxlLSrar=s?C_<(yjS8*=7XD8K25 zEH`+N7XotTxtIG;WW{FmPtp{F>t#+a*OUb%IY|$-ghoHZW*l-(UQEKp3JtNu4vk@n zLm2rDmbjtj@ASswzAIt78Na`5t}%$mZw9^6Vv_&<_TcZbOd0iTBEt+{)&6abLL}e) zue4ay+1Qr&$lt^>lpr*YMfOI>y4!@?JLdfAX7RGS(0l>Q*U3=kOctbC5EJ zaT7DIWR5u%I;Dm*kQUNGdZT`rGGy&$KgJUItqh)NS`gfJv0i}vGAbi}GjT8LS2BnC Q*S8g~P^<_Z|MBnt12S2)@c;k- From f84ef879b63c3f47da0a0a86269e9db74adf4f2e Mon Sep 17 00:00:00 2001 From: Yanis42 <35189056+Yanis42@users.noreply.github.com> Date: Wed, 20 Sep 2023 18:34:32 +0200 Subject: [PATCH 11/74] remove duplicates --- fast64_internal/oot/oot_constants.py | 31 +++------------------------- 1 file changed, 3 insertions(+), 28 deletions(-) diff --git a/fast64_internal/oot/oot_constants.py b/fast64_internal/oot/oot_constants.py index b456d59..c61e8bd 100644 --- a/fast64_internal/oot/oot_constants.py +++ b/fast64_internal/oot/oot_constants.py @@ -21,37 +21,19 @@ ootRoomShapeEntryStructs = [ "RoomShapeCullableEntry", ] - -ootEnumSceneMenu = [ - ("General", "General", "General"), - ("Lighting", "Lighting", "Lighting"), - ("Cutscene", "Cutscene", "Cutscene"), - ("Exits", "Exits", "Exits"), - ("Alternate", "Alternate", "Alternate"), -] - -ootEnumRenderScene = [ - ("General", "General", "General"), - ("Alternate", "Alternate", "Alternate"), -] - ootEnumSceneMenuAlternate = [ ("General", "General", "General"), ("Lighting", "Lighting", "Lighting"), ("Cutscene", "Cutscene", "Cutscene"), ("Exits", "Exits", "Exits"), ] - -ootEnumRoomMenu = [ - ("General", "General", "General"), - ("Objects", "Objects", "Objects"), - ("Alternate", "Alternate", "Alternate"), -] +ootEnumSceneMenu = ootEnumSceneMenuAlternate + [("Alternate", "Alternate", "Alternate"),] ootEnumRoomMenuAlternate = [ ("General", "General", "General"), ("Objects", "Objects", "Objects"), ] +ootEnumRoomMenu = ootEnumRoomMenuAlternate + [("Alternate", "Alternate", "Alternate"),] ootEnumHeaderMenu = [ ("Child Night", "Child Night", "Child Night"), @@ -59,14 +41,7 @@ ootEnumHeaderMenu = [ ("Adult Night", "Adult Night", "Adult Night"), ("Cutscene", "Cutscene", "Cutscene"), ] - -ootEnumHeaderMenuComplete = [ - ("Child Day", "Child Day", "Child Day"), - ("Child Night", "Child Night", "Child Night"), - ("Adult Day", "Adult Day", "Adult Day"), - ("Adult Night", "Adult Night", "Adult Night"), - ("Cutscene", "Cutscene", "Cutscene"), -] +ootEnumHeaderMenuComplete = [("Child Day", "Child Day", "Child Day"),] + ootEnumHeaderMenu ootEnumLightGroupMenu = [ ("Dawn", "Dawn", "Dawn"), From 165a0860ea6398e5bc60ed922d00b1ce29be049b Mon Sep 17 00:00:00 2001 From: Yanis42 <35189056+Yanis42@users.noreply.github.com> Date: Wed, 20 Sep 2023 19:13:48 +0200 Subject: [PATCH 12/74] more cleanup --- fast64_internal/oot/actor/properties.py | 7 +- fast64_internal/oot/oot_constants.py | 80 +------------------ fast64_internal/oot/props_panel_main.py | 14 +++- fast64_internal/oot/room/properties.py | 7 +- .../oot/scene/exporter/to_c/room_shape.py | 13 ++- fast64_internal/oot/scene/properties.py | 40 ++++++++-- 6 files changed, 73 insertions(+), 88 deletions(-) diff --git a/fast64_internal/oot/actor/properties.py b/fast64_internal/oot/actor/properties.py index 65a6508..df2494e 100644 --- a/fast64_internal/oot/actor/properties.py +++ b/fast64_internal/oot/actor/properties.py @@ -2,7 +2,7 @@ from bpy.types import Object, PropertyGroup, UILayout from bpy.utils import register_class, unregister_class from bpy.props import EnumProperty, StringProperty, IntProperty, BoolProperty, CollectionProperty, PointerProperty from ...utility import prop_split, label_split -from ..oot_constants import ootData, ootEnumSceneSetupPreset, ootEnumCamTransition +from ..oot_constants import ootData, ootEnumCamTransition from ..scene.properties import OOTAlternateSceneHeaderProperty from ..room.properties import OOTAlternateRoomHeaderProperty from .operators import OOT_SearchActorIDEnumOperator @@ -15,6 +15,11 @@ from ..oot_utility import ( drawEnumWithCustom, ) +ootEnumSceneSetupPreset = [ + ("Custom", "Custom", "Custom"), + ("All Scene Setups", "All Scene Setups", "All Scene Setups"), + ("All Non-Cutscene Scene Setups", "All Non-Cutscene Scene Setups", "All Non-Cutscene Scene Setups"), +] class OOTActorHeaderItemProperty(PropertyGroup): headerIndex: IntProperty(name="Scene Setup", min=4, default=4) diff --git a/fast64_internal/oot/oot_constants.py b/fast64_internal/oot/oot_constants.py index c61e8bd..839e76a 100644 --- a/fast64_internal/oot/oot_constants.py +++ b/fast64_internal/oot/oot_constants.py @@ -9,32 +9,6 @@ ootEnumRoomShapeType = [ ("ROOM_SHAPE_TYPE_CULLABLE", "Cullable", "Cullable"), ] -ootRoomShapeStructs = [ - "RoomShapeNormal", - "RoomShapeImage", - "RoomShapeCullable", -] - -ootRoomShapeEntryStructs = [ - "RoomShapeDListsEntry", - "RoomShapeDListsEntry", - "RoomShapeCullableEntry", -] - -ootEnumSceneMenuAlternate = [ - ("General", "General", "General"), - ("Lighting", "Lighting", "Lighting"), - ("Cutscene", "Cutscene", "Cutscene"), - ("Exits", "Exits", "Exits"), -] -ootEnumSceneMenu = ootEnumSceneMenuAlternate + [("Alternate", "Alternate", "Alternate"),] - -ootEnumRoomMenuAlternate = [ - ("General", "General", "General"), - ("Objects", "Objects", "Objects"), -] -ootEnumRoomMenu = ootEnumRoomMenuAlternate + [("Alternate", "Alternate", "Alternate"),] - ootEnumHeaderMenu = [ ("Child Night", "Child Night", "Child Night"), ("Adult Day", "Adult Day", "Adult Day"), @@ -43,13 +17,6 @@ ootEnumHeaderMenu = [ ] ootEnumHeaderMenuComplete = [("Child Day", "Child Day", "Child Day"),] + ootEnumHeaderMenu -ootEnumLightGroupMenu = [ - ("Dawn", "Dawn", "Dawn"), - ("Day", "Day", "Day"), - ("Dusk", "Dusk", "Dusk"), - ("Night", "Night", "Night"), -] - ootEnumLinkIdle = [ ("Custom", "Custom", "Custom"), ("0x00", "Default", "Default"), @@ -62,21 +29,6 @@ ootEnumLinkIdle = [ ("0xFF", "Hops On Epona", "Hops On Epona"), ] -# Make sure to add exceptions in utility.py - selectMeshChildrenOnly -ootEnumEmptyType = [ - ("None", "None", "None"), - ("Scene", "Scene", "Scene"), - ("Room", "Room", "Room"), - ("Actor", "Actor", "Actor"), - ("Transition Actor", "Transition Actor", "Transition Actor"), - ("Entrance", "Entrance", "Entrance"), - ("Water Box", "Water Box", "Water Box"), - ("Cull Group", "Custom Cull Group", "Cull Group"), - ("LOD", "LOD Group", "LOD Group"), - ("Cutscene", "Cutscene", "Cutscene"), - # ('Camera Volume', 'Camera Volume', 'Camera Volume'), -] - ootEnumCloudiness = [ ("Custom", "Custom", "Custom"), ("0x00", "Sunny", "Sunny"), @@ -323,22 +275,6 @@ ootEnumNaviHints = [ ("0x02", "Dungeon", "elf_message_ydan"), ] -ootEnumTransitionAnims = [ - ("Custom", "Custom", "Custom"), - ("0x00", "Spiky", "Spiky"), - ("0x01", "Triforce", "Triforce"), - ("0x02", "Slow Black Fade", "Slow Black Fade"), - ("0x03", "Slow Day/White, Slow Night/Black Fade", "Slow Day/White, Slow Night/Black Fade"), - ("0x04", "Fast Day/Black, Slow Night/Black Fade", "Fast Day/Black, Slow Night/Black Fade"), - ("0x05", "Fast Day/White, Slow Night/Black Fade", "Fast Day/White, Slow Night/Black Fade"), - ("0x06", "Very Slow Day/White, Slow Night/Black Fade", "Very Slow Day/White, Slow Night/Black Fade"), - ("0x07", "Very Slow Day/White, Slow Night/Black Fade", "Very Slow Day/White, Slow Night/Black Fade"), - ("0x0E", "Slow Sandstorm Fade", "Slow Sandstorm Fade"), - ("0x0F", "Fast Sandstorm Fade", "Fast Sandstorm Fade"), - ("0x20", "Iris Fade", "Iris Fade"), - ("0x2C", "Shortcut Transition", "Shortcut Transition"), -] - # The order of this list matters (normal OoT scene order as defined by ``scene_table.h``) ootEnumSceneID = [ ("Custom", "Custom", "Custom"), @@ -574,6 +510,7 @@ ootSceneIDToName = { "SCENE_SASATEST": "sasatest", "SCENE_TESTROOM": "testroom", } +ootSceneNameToID = {val: key for key, val in ootSceneIDToName.items()} ootEnumCamTransition = [ ("Custom", "Custom", "Custom"), @@ -582,7 +519,7 @@ ootEnumCamTransition = [ # ("0xFF", "0xFF", "0xFF"), ] -# see curRoom.unk_03 +# see curRoom.behaviorType1 ootEnumRoomBehaviour = [ ("Custom", "Custom", "Custom"), ("0x00", "Default", "Default"), @@ -593,17 +530,6 @@ ootEnumRoomBehaviour = [ ("0x05", "Disable Darker Screen Effect (NL/Spins)", "Disable Darker Screen Effect (NL/Spins)"), ] -ootEnumExitIndex = [ - ("Custom", "Custom", "Custom"), - ("Default", "Default", "Default"), -] - -ootEnumSceneSetupPreset = [ - ("Custom", "Custom", "Custom"), - ("All Scene Setups", "All Scene Setups", "All Scene Setups"), - ("All Non-Cutscene Scene Setups", "All Non-Cutscene Scene Setups", "All Non-Cutscene Scene Setups"), -] - ootEnumDrawConfig = [ ("Custom", "Custom", "Custom"), ("SDC_DEFAULT", "Default", "Default"), @@ -664,5 +590,3 @@ ootEnumDrawConfig = [ ("SDC_GANONS_TOWER_COLLAPSE_INTERIOR", "Ganon's Tower (Collapsing) (Ganon Sonogo)", "Ganon Sonogo"), ("SDC_INSIDE_GANONS_CASTLE_COLLAPSE", "Inside Ganon's Castle (Collapsing) (Ganontika Sonogo)", "Ganontika Sonogo"), ] - -ootSceneNameToID = {val: key for key, val in ootSceneIDToName.items()} diff --git a/fast64_internal/oot/props_panel_main.py b/fast64_internal/oot/props_panel_main.py index 39177fa..cf260d6 100644 --- a/fast64_internal/oot/props_panel_main.py +++ b/fast64_internal/oot/props_panel_main.py @@ -1,7 +1,6 @@ import bpy from bpy.utils import register_class, unregister_class from ..utility import prop_split, gammaInverse -from .oot_constants import ootEnumEmptyType from .oot_utility import getSceneObj, getRoomObj from .scene.properties import OOTSceneProperties from .room.properties import OOTObjectProperty, OOTRoomHeaderProperty, OOTAlternateRoomHeaderProperty @@ -14,6 +13,19 @@ from .actor.properties import ( OOTEntranceProperty, ) +# Make sure to add exceptions in utility.py - selectMeshChildrenOnly +ootEnumEmptyType = [ + ("None", "None", "None"), + ("Scene", "Scene", "Scene"), + ("Room", "Room", "Room"), + ("Actor", "Actor", "Actor"), + ("Transition Actor", "Transition Actor", "Transition Actor"), + ("Entrance", "Entrance", "Entrance"), + ("Water Box", "Water Box", "Water Box"), + ("Cull Group", "Custom Cull Group", "Cull Group"), + ("LOD", "LOD Group", "LOD Group"), + ("Cutscene", "Cutscene", "Cutscene"), +] def drawSceneHeader(box: bpy.types.UILayout, obj: bpy.types.Object): objName = obj.name diff --git a/fast64_internal/oot/room/properties.py b/fast64_internal/oot/room/properties.py index 1ad2c44..68c0a48 100644 --- a/fast64_internal/oot/room/properties.py +++ b/fast64_internal/oot/room/properties.py @@ -19,14 +19,17 @@ from bpy.props import ( from ..oot_constants import ( ootData, - ootEnumRoomMenu, - ootEnumRoomMenuAlternate, ootEnumRoomBehaviour, ootEnumLinkIdle, ootEnumRoomShapeType, ootEnumHeaderMenu, ) +ootEnumRoomMenuAlternate = [ + ("General", "General", "General"), + ("Objects", "Objects", "Objects"), +] +ootEnumRoomMenu = ootEnumRoomMenuAlternate + [("Alternate", "Alternate", "Alternate"),] class OOTObjectProperty(PropertyGroup): expandTab: BoolProperty(name="Expand Tab") diff --git a/fast64_internal/oot/scene/exporter/to_c/room_shape.py b/fast64_internal/oot/scene/exporter/to_c/room_shape.py index e4f6bdf..141770e 100644 --- a/fast64_internal/oot/scene/exporter/to_c/room_shape.py +++ b/fast64_internal/oot/scene/exporter/to_c/room_shape.py @@ -1,9 +1,20 @@ from .....utility import CData, indent from .....f3d.f3d_gbi import ScrollMethod, TextureExportSettings from ....oot_model_classes import OOTGfxFormatter -from ....oot_constants import ootRoomShapeStructs, ootRoomShapeEntryStructs, ootEnumRoomShapeType +from ....oot_constants import ootEnumRoomShapeType from ....oot_level_classes import OOTRoom, OOTRoomMeshGroup, OOTRoomMesh +ootRoomShapeStructs = [ + "RoomShapeNormal", + "RoomShapeImage", + "RoomShapeCullable", +] + +ootRoomShapeEntryStructs = [ + "RoomShapeDListsEntry", + "RoomShapeDListsEntry", + "RoomShapeCullableEntry", +] def getRoomShapeDLEntry(meshEntry: OOTRoomMeshGroup, roomShape: str): opaqueName = meshEntry.DLGroup.opaque.name if meshEntry.DLGroup.opaque is not None else "NULL" diff --git a/fast64_internal/oot/scene/properties.py b/fast64_internal/oot/scene/properties.py index b81af4c..a12194e 100644 --- a/fast64_internal/oot/scene/properties.py +++ b/fast64_internal/oot/scene/properties.py @@ -28,9 +28,6 @@ from ..oot_utility import ( from ..oot_constants import ( ootEnumMusicSeq, ootEnumSceneID, - ootEnumExitIndex, - ootEnumTransitionAnims, - ootEnumLightGroupMenu, ootEnumGlobalObject, ootEnumNaviHints, ootEnumSkybox, @@ -40,13 +37,46 @@ from ..oot_constants import ( ootEnumCameraMode, ootEnumNightSeq, ootEnumAudioSessionPreset, - ootEnumSceneMenu, - ootEnumSceneMenuAlternate, ootEnumHeaderMenu, ootEnumDrawConfig, ootEnumHeaderMenuComplete, ) +ootEnumSceneMenuAlternate = [ + ("General", "General", "General"), + ("Lighting", "Lighting", "Lighting"), + ("Cutscene", "Cutscene", "Cutscene"), + ("Exits", "Exits", "Exits"), +] +ootEnumSceneMenu = ootEnumSceneMenuAlternate + [("Alternate", "Alternate", "Alternate"),] + +ootEnumLightGroupMenu = [ + ("Dawn", "Dawn", "Dawn"), + ("Day", "Day", "Day"), + ("Dusk", "Dusk", "Dusk"), + ("Night", "Night", "Night"), +] + +ootEnumTransitionAnims = [ + ("Custom", "Custom", "Custom"), + ("0x00", "Spiky", "Spiky"), + ("0x01", "Triforce", "Triforce"), + ("0x02", "Slow Black Fade", "Slow Black Fade"), + ("0x03", "Slow Day/White, Slow Night/Black Fade", "Slow Day/White, Slow Night/Black Fade"), + ("0x04", "Fast Day/Black, Slow Night/Black Fade", "Fast Day/Black, Slow Night/Black Fade"), + ("0x05", "Fast Day/White, Slow Night/Black Fade", "Fast Day/White, Slow Night/Black Fade"), + ("0x06", "Very Slow Day/White, Slow Night/Black Fade", "Very Slow Day/White, Slow Night/Black Fade"), + ("0x07", "Very Slow Day/White, Slow Night/Black Fade", "Very Slow Day/White, Slow Night/Black Fade"), + ("0x0E", "Slow Sandstorm Fade", "Slow Sandstorm Fade"), + ("0x0F", "Fast Sandstorm Fade", "Fast Sandstorm Fade"), + ("0x20", "Iris Fade", "Iris Fade"), + ("0x2C", "Shortcut Transition", "Shortcut Transition"), +] + +ootEnumExitIndex = [ + ("Custom", "Custom", "Custom"), + ("Default", "Default", "Default"), +] class OOTSceneCommon: ootEnumBootMode = [ From 7e041472ff01306a73ffac46d6cc295a412ea21b Mon Sep 17 00:00:00 2001 From: Yanis42 <35189056+Yanis42@users.noreply.github.com> Date: Wed, 20 Sep 2023 19:16:07 +0200 Subject: [PATCH 13/74] format --- fast64_internal/oot/actor/properties.py | 1 + fast64_internal/oot/oot_constants.py | 4 +++- fast64_internal/oot/props_panel_main.py | 1 + fast64_internal/oot/room/properties.py | 5 ++++- fast64_internal/oot/scene/exporter/to_c/room_shape.py | 1 + fast64_internal/oot/scene/properties.py | 5 ++++- 6 files changed, 14 insertions(+), 3 deletions(-) diff --git a/fast64_internal/oot/actor/properties.py b/fast64_internal/oot/actor/properties.py index df2494e..d8df1fd 100644 --- a/fast64_internal/oot/actor/properties.py +++ b/fast64_internal/oot/actor/properties.py @@ -21,6 +21,7 @@ ootEnumSceneSetupPreset = [ ("All Non-Cutscene Scene Setups", "All Non-Cutscene Scene Setups", "All Non-Cutscene Scene Setups"), ] + class OOTActorHeaderItemProperty(PropertyGroup): headerIndex: IntProperty(name="Scene Setup", min=4, default=4) expandTab: BoolProperty(name="Expand Tab") diff --git a/fast64_internal/oot/oot_constants.py b/fast64_internal/oot/oot_constants.py index 839e76a..a3feafe 100644 --- a/fast64_internal/oot/oot_constants.py +++ b/fast64_internal/oot/oot_constants.py @@ -15,7 +15,9 @@ ootEnumHeaderMenu = [ ("Adult Night", "Adult Night", "Adult Night"), ("Cutscene", "Cutscene", "Cutscene"), ] -ootEnumHeaderMenuComplete = [("Child Day", "Child Day", "Child Day"),] + ootEnumHeaderMenu +ootEnumHeaderMenuComplete = [ + ("Child Day", "Child Day", "Child Day"), +] + ootEnumHeaderMenu ootEnumLinkIdle = [ ("Custom", "Custom", "Custom"), diff --git a/fast64_internal/oot/props_panel_main.py b/fast64_internal/oot/props_panel_main.py index cf260d6..ec44710 100644 --- a/fast64_internal/oot/props_panel_main.py +++ b/fast64_internal/oot/props_panel_main.py @@ -27,6 +27,7 @@ ootEnumEmptyType = [ ("Cutscene", "Cutscene", "Cutscene"), ] + def drawSceneHeader(box: bpy.types.UILayout, obj: bpy.types.Object): objName = obj.name obj.ootSceneHeader.draw_props(box, None, None, objName) diff --git a/fast64_internal/oot/room/properties.py b/fast64_internal/oot/room/properties.py index 68c0a48..c7096a4 100644 --- a/fast64_internal/oot/room/properties.py +++ b/fast64_internal/oot/room/properties.py @@ -29,7 +29,10 @@ ootEnumRoomMenuAlternate = [ ("General", "General", "General"), ("Objects", "Objects", "Objects"), ] -ootEnumRoomMenu = ootEnumRoomMenuAlternate + [("Alternate", "Alternate", "Alternate"),] +ootEnumRoomMenu = ootEnumRoomMenuAlternate + [ + ("Alternate", "Alternate", "Alternate"), +] + class OOTObjectProperty(PropertyGroup): expandTab: BoolProperty(name="Expand Tab") diff --git a/fast64_internal/oot/scene/exporter/to_c/room_shape.py b/fast64_internal/oot/scene/exporter/to_c/room_shape.py index 141770e..fd7dd90 100644 --- a/fast64_internal/oot/scene/exporter/to_c/room_shape.py +++ b/fast64_internal/oot/scene/exporter/to_c/room_shape.py @@ -16,6 +16,7 @@ ootRoomShapeEntryStructs = [ "RoomShapeCullableEntry", ] + def getRoomShapeDLEntry(meshEntry: OOTRoomMeshGroup, roomShape: str): opaqueName = meshEntry.DLGroup.opaque.name if meshEntry.DLGroup.opaque is not None else "NULL" transparentName = meshEntry.DLGroup.transparent.name if meshEntry.DLGroup.transparent is not None else "NULL" diff --git a/fast64_internal/oot/scene/properties.py b/fast64_internal/oot/scene/properties.py index a12194e..e83991f 100644 --- a/fast64_internal/oot/scene/properties.py +++ b/fast64_internal/oot/scene/properties.py @@ -48,7 +48,9 @@ ootEnumSceneMenuAlternate = [ ("Cutscene", "Cutscene", "Cutscene"), ("Exits", "Exits", "Exits"), ] -ootEnumSceneMenu = ootEnumSceneMenuAlternate + [("Alternate", "Alternate", "Alternate"),] +ootEnumSceneMenu = ootEnumSceneMenuAlternate + [ + ("Alternate", "Alternate", "Alternate"), +] ootEnumLightGroupMenu = [ ("Dawn", "Dawn", "Dawn"), @@ -78,6 +80,7 @@ ootEnumExitIndex = [ ("Default", "Default", "Default"), ] + class OOTSceneCommon: ootEnumBootMode = [ ("Play", "Play", "Play"), From ee7ccca513ec1706b2d60f41aa43325ba694d12f Mon Sep 17 00:00:00 2001 From: Yanis42 <35189056+Yanis42@users.noreply.github.com> Date: Sat, 23 Sep 2023 18:18:57 +0200 Subject: [PATCH 14/74] entrance actors: room obj selection --- fast64_internal/oot/actor/properties.py | 24 ++++++++++++++++++------ fast64_internal/oot/oot_level_parser.py | 1 + fast64_internal/oot/oot_level_writer.py | 10 ++++++++-- fast64_internal/oot/oot_upgrade.py | 12 ++++++++++++ fast64_internal/oot/props_panel_main.py | 4 +++- 5 files changed, 42 insertions(+), 9 deletions(-) diff --git a/fast64_internal/oot/actor/properties.py b/fast64_internal/oot/actor/properties.py index 65a6508..d349a65 100644 --- a/fast64_internal/oot/actor/properties.py +++ b/fast64_internal/oot/actor/properties.py @@ -3,6 +3,7 @@ from bpy.utils import register_class, unregister_class from bpy.props import EnumProperty, StringProperty, IntProperty, BoolProperty, CollectionProperty, PointerProperty from ...utility import prop_split, label_split from ..oot_constants import ootData, ootEnumSceneSetupPreset, ootEnumCamTransition +from ..oot_upgrade import upgradeActors from ..scene.properties import OOTAlternateSceneHeaderProperty from ..room.properties import OOTAlternateRoomHeaderProperty from .operators import OOT_SearchActorIDEnumOperator @@ -110,6 +111,11 @@ class OOTActorProperty(PropertyGroup): rotOverrideZ: StringProperty(name="Rot Z", default="0") headerSettings: PointerProperty(type=OOTActorHeaderProperty) + @staticmethod + def upgrade_object(obj: Object): + print(f"Processing '{obj.name}'...") + upgradeActors(obj) + def draw_props(self, layout: UILayout, altRoomProp: OOTAlternateRoomHeaderProperty, objName: str): # prop_split(layout, actorProp, 'actorID', 'Actor') actorIDBox = layout.column() @@ -188,23 +194,29 @@ class OOTTransitionActorProperty(PropertyGroup): class OOTEntranceProperty(PropertyGroup): - # This is also used in entrance list, and roomIndex is obtained from the room this empty is parented to. + # This is also used in entrance list. spawnIndex: IntProperty(min=0) customActor: BoolProperty(name="Use Custom Actor") actor: PointerProperty(type=OOTActorProperty) + tiedRoom: PointerProperty( + type=Object, + poll=lambda self, object: self.isRoomEmptyObject(object), + description="Used to set the room index", + ) + + def isRoomEmptyObject(self, obj: Object): + return obj.type == "EMPTY" and obj.ootEmptyType == "Room" + def draw_props(self, layout: UILayout, obj: Object, altSceneProp: OOTAlternateSceneHeaderProperty, objName: str): box = layout.column() # box.box().label(text = "Properties") roomObj = getRoomObj(obj) - if roomObj is not None: - split = box.split(factor=0.5) - split.label(text="Room Index") - split.label(text=str(roomObj.ootRoomHeader.roomIndex)) - else: + if roomObj is None: box.label(text="This must be part of a Room empty's hierarchy.", icon="OUTLINER") entranceProp = obj.ootEntranceProperty + prop_split(box, entranceProp, "tiedRoom", "Room") prop_split(box, entranceProp, "spawnIndex", "Spawn Index") prop_split(box, entranceProp.actor, "actorParam", "Actor Param") box.prop(entranceProp, "customActor") diff --git a/fast64_internal/oot/oot_level_parser.py b/fast64_internal/oot/oot_level_parser.py index 887f090..0abf0d5 100644 --- a/fast64_internal/oot/oot_level_parser.py +++ b/fast64_internal/oot/oot_level_parser.py @@ -808,6 +808,7 @@ def parseSpawnList( spawnObj.ootEmptyType = "Entrance" spawnObj.name = "Entrance" spawnProp = spawnObj.ootEntranceProperty + spawnProp.tiedRoom = roomObjs[roomIndex] spawnProp.spawnIndex = spawnIndex spawnProp.customActor = actorID != "ACTOR_PLAYER" actorProp = spawnProp.actor diff --git a/fast64_internal/oot/oot_level_writer.py b/fast64_internal/oot/oot_level_writer.py index 33da8d6..1254e0d 100644 --- a/fast64_internal/oot/oot_level_writer.py +++ b/fast64_internal/oot/oot_level_writer.py @@ -818,8 +818,14 @@ def ootProcessEmpties(scene, room, sceneObj, obj, transformMatrix): ) elif obj.ootEmptyType == "Entrance": entranceProp = obj.ootEntranceProperty - spawnIndex = obj.ootEntranceProperty.spawnIndex - addActor(scene, OOTEntrance(room.roomIndex, spawnIndex), entranceProp.actor, "entranceList", obj.name) + spawnIndex = entranceProp.spawnIndex + + if entranceProp.tiedRoom is not None: + roomIndex = entranceProp.tiedRoom.ootRoomHeader.roomIndex + else: + raise PluginError("ERROR: The room isn't set!") + + addActor(scene, OOTEntrance(roomIndex, spawnIndex), entranceProp.actor, "entranceList", obj.name) addStartPosition( scene, spawnIndex, diff --git a/fast64_internal/oot/oot_upgrade.py b/fast64_internal/oot/oot_upgrade.py index 33a5237..4061b25 100644 --- a/fast64_internal/oot/oot_upgrade.py +++ b/fast64_internal/oot/oot_upgrade.py @@ -1,3 +1,4 @@ +import bpy from bpy.types import Object, CollectionProperty from .data import OoT_ObjectData @@ -34,3 +35,14 @@ def upgradeRoomHeaders(roomObj: Object, objData: OoT_ObjectData): upgradeObjectList(sceneLayer.objectList, objData) for i in range(len(altHeaders.cutsceneHeaders)): upgradeObjectList(altHeaders.cutsceneHeaders[i].objectList, objData) + + +def upgradeActors(actorObj: Object): + if actorObj.ootEmptyType == "Entrance": + entranceProp = actorObj.ootEntranceProperty + + for obj in bpy.data.objects: + if obj.type == "EMPTY" and obj.ootEmptyType == "Room": + if actorObj in obj.children_recursive: + entranceProp.tiedRoom = obj + break diff --git a/fast64_internal/oot/props_panel_main.py b/fast64_internal/oot/props_panel_main.py index 39177fa..9c465d5 100644 --- a/fast64_internal/oot/props_panel_main.py +++ b/fast64_internal/oot/props_panel_main.py @@ -154,9 +154,11 @@ class OOT_ObjectProperties(bpy.types.PropertyGroup): @staticmethod def upgrade_changed_props(): for obj in bpy.data.objects: - if obj.data is None: + if obj.type == "EMPTY": if obj.ootEmptyType == "Room": OOTObjectProperty.upgrade_object(obj) + if obj.ootEmptyType == "Entrance": + OOTActorProperty.upgrade_object(obj) class OOTCullGroupProperty(bpy.types.PropertyGroup): From e8686eeb55d1377bcae439fa2f0b633e5fc705ef Mon Sep 17 00:00:00 2001 From: Sauraen Date: Sun, 8 Oct 2023 21:27:38 -0700 Subject: [PATCH 15/74] Porting former CustomMicrocode branch to latest fast64 and latest F3DEX3 changes --- fast64_internal/f3d/f3d_enums.py | 1 + fast64_internal/f3d/f3d_gbi.py | 581 ++++++++++++++------ fast64_internal/f3d/f3d_material.py | 303 +++++++++- fast64_internal/f3d/f3d_material_presets.py | 310 +++++++++++ fast64_internal/f3d/f3d_parser.py | 73 ++- fast64_internal/f3d/f3d_writer.py | 2 +- 6 files changed, 1051 insertions(+), 219 deletions(-) diff --git a/fast64_internal/f3d/f3d_enums.py b/fast64_internal/f3d/f3d_enums.py index d546b49..0fa09a7 100644 --- a/fast64_internal/f3d/f3d_enums.py +++ b/fast64_internal/f3d/f3d_enums.py @@ -363,6 +363,7 @@ enumF3D = [ ("F3DLP.Rej", "F3DLP.Rej", "F3DLP.Rej"), ("F3DEX2/LX2", "F3DEX2/LX2", "F3DEX2/LX2"), ("F3DEX2.Rej/LX2.Rej", "F3DEX2.Rej/LX2.Rej", "F3DEX2.Rej/LX2.Rej"), + ("F3DEX3", "F3DEX3", "F3DEX3"), ] enumLargeEdges = [ diff --git a/fast64_internal/f3d/f3d_gbi.py b/fast64_internal/f3d/f3d_gbi.py index 55301f7..b5aaac9 100644 --- a/fast64_internal/f3d/f3d_gbi.py +++ b/fast64_internal/f3d/f3d_gbi.py @@ -53,16 +53,8 @@ dlTypeEnum = [ ("PROCEDURAL", "Procedural", "Procedural"), ] -lightIndex = { - "LIGHT_1": 1, - "LIGHT_2": 2, - "LIGHT_3": 3, - "LIGHT_4": 4, - "LIGHT_5": 5, - "LIGHT_6": 6, - "LIGHT_7": 7, - "LIGHT_8": 8, -} +# 1-8 for F3DEX2 etc., 1-10 for F3DEX3 +lightIndex = {"LIGHT_" + str(n): n for n in range(1, 11)} # tuple of max buffer size, max load count. vertexBufferSize = { @@ -72,6 +64,7 @@ vertexBufferSize = { "F3DLP.Rej": (80, 32), "F3DEX2/LX2": (32, 32), "F3DEX2.Rej/LX2.Rej": (64, 64), + "F3DEX3": (56, 56), } drawLayerRenderMode = { @@ -123,39 +116,43 @@ ACMUXDict = { } +def isUcodeF3DEX1(F3D_VER): + return F3D_VER in {"F3DLP.Rej", "F3DLX.Rej", "F3DEX/LX"} + + +def isUcodeF3DEX2(F3D_VER): + return F3D_VER in {"F3DEX2.Rej/LX2.Rej", "F3DEX2/LX2"} + + +def isUcodeF3DEX3(F3D_VER): + return F3D_VER == "F3DEX3" + + class F3D: """NOTE: do not initialize this class manually! use get_F3D_GBI so that the single instance is cached from the microcode type.""" def __init__(self, F3D_VER, _HW_VERSION_1): - if F3D_VER == "F3DEX2.Rej/LX2.Rej" or F3D_VER == "F3DEX2/LX2": - self.F3DEX_GBI = False - self.F3DEX_GBI_2 = True - self.F3DLP_GBI = False - elif F3D_VER == "F3DLP.Rej" or F3D_VER == "F3DLX.Rej" or F3D_VER == "F3DEX/LX": - self.F3DEX_GBI = True - self.F3DEX_GBI_2 = False - self.F3DLP_GBI = True - elif F3D_VER == "F3D": - self.F3DEX_GBI = False - self.F3DEX_GBI_2 = False - self.F3DLP_GBI = False - else: - raise PluginError("Invalid F3D version " + F3D_VER + ".") + F3DEX_GBI = self.F3DEX_GBI = isUcodeF3DEX1(F3D_VER) + F3DEX_GBI_2 = self.F3DEX_GBI_2 = isUcodeF3DEX2(F3D_VER) + F3DEX_GBI_3 = self.F3DEX_GBI_3 = isUcodeF3DEX3(F3D_VER) + F3DLP_GBI = self.F3DLP_GBI = self.F3DEX_GBI + + # F3DEX2 is F3DEX1 and F3DEX3 is F3DEX2, but F3DEX3 is not F3DEX1 + if F3DEX_GBI_2: + F3DEX_GBI = self.F3DEX_GBI = True + elif F3DEX_GBI_3: + F3DEX_GBI_2 = self.F3DEX_GBI_2 = True self.vert_buffer_size = vertexBufferSize[F3D_VER][0] self.vert_load_size = vertexBufferSize[F3D_VER][1] + self.G_MAX_LIGHTS = 9 if F3DEX_GBI_3 else 7 + self.G_INPUT_BUFFER_CMDS = 21 - F3DEX_GBI = self.F3DEX_GBI - F3DEX_GBI_2 = self.F3DEX_GBI_2 - F3DLP_GBI = self.F3DLP_GBI self._HW_VERSION_1 = _HW_VERSION_1 self.F3D_VER = F3D_VER # self._LANGUAGE_ASSEMBLY = _LANGUAGE_ASSEMBLY if F3DEX_GBI_2: - self.F3DEX_GBI = True - F3DEX_GBI = True - self.G_NOOP = 0x00 self.G_RDPHALF_2 = 0xF1 self.G_SETOTHERMODE_H = 0xE3 @@ -172,9 +169,6 @@ class F3D: self.G_POPMTX = 0xD8 self.G_TEXTURE = 0xD7 self.G_DMA_IO = 0xD6 - self.G_SPECIAL_1 = 0xD5 - self.G_SPECIAL_2 = 0xD4 - self.G_SPECIAL_3 = 0xD3 self.G_VTX = 0x01 self.G_MODIFYVTX = 0x02 @@ -183,7 +177,19 @@ class F3D: self.G_TRI1 = 0x05 self.G_TRI2 = 0x06 self.G_QUAD = 0x07 - self.G_LINE3D = 0x08 + + if F3DEX_GBI_3: + self.G_RETURNNONEVISIBLE = 0xD4 + self.G_BOUNDINGVERTS = 0xD5 + self.G_POPBRANCHCALL = 0x08 + self.G_TRISTRIP = 0x09 + self.G_TRIFAN = 0x0A + self.G_LIGHTTORDP = 0x0B + else: + self.G_SPECIAL_1 = 0xD5 + self.G_SPECIAL_2 = 0xD4 + self.G_SPECIAL_3 = 0xD3 + self.G_LINE3D = 0x08 else: # DMA commands @@ -335,6 +341,41 @@ class F3D: self.G_CLIPPING = 0x00800000 else: self.G_CLIPPING = 0x00000000 + + if F3DEX_GBI_3: + self.G_ATTROFFSET_ST_ENABLE = 0x00000100 + self.G_ATTROFFSET_Z_ENABLE = 0x00000800 + self.G_PACKED_NORMALS = 0x00001000 + self.G_LIGHTTOALPHA = 0x00002000 + self.G_AMBOCCLUSION = 0x00004000 + self.G_FRESNEL = 0x00008000 + self.G_LIGHTING_POSITIONAL = 0x00400000 # Ignored, always on + + self.allGeomModeFlags = { + "G_ZBUFFER", + "G_TEXTURE_ENABLE", + "G_SHADE", + "G_CULL_FRONT", + "G_CULL_BACK", + "G_CULL_BOTH", + "G_FOG", + "G_LIGHTING", + "G_TEXTURE_GEN", + "G_TEXTURE_GEN_LINEAR", + "G_LOD", + "G_SHADING_SMOOTH", + "G_LIGHTING_POSITIONAL", + "G_CLIPPING", + } + if F3DEX_GBI_3: + self.allGeomModeFlags += { + "G_ATTROFFSET_ST_ENABLE", + "G_ATTROFFSET_Z_ENABLE", + "G_PACKED_NORMALS", + "G_LIGHTTOALPHA", + "G_AMBOCCLUSION", + "G_FRESNEL", + } # if _LANGUAGE_ASSEMBLY: self.G_FOG_H = self.G_FOG / 0x10000 @@ -1396,6 +1437,18 @@ class F3D: self.G_DL_PUSH = 0x00 self.G_DL_NOPUSH = 0x01 + if F3DEX_GBI_3: + self.G_NORMALS_MODE_FAST = 0x00 + self.G_NORMALS_MODE_AUTO = 0x01 + self.G_NORMALS_MODE_MANUAL = 0x02 + + self.G_ALPHA_COMPARE_CULL_DISABLE = 0 + self.G_ALPHA_COMPARE_CULL_BELOW = 1 + self.G_ALPHA_COMPARE_CULL_ABOVE = -1 + + self.G_BOUNDINGVERTS_REPLACE = 0 + self.G_BOUNDINGVERTS_PUSH = -1 + # Some structs here self.G_MAXZ = 0x03FF # 10 bits of integer screen-Z precision @@ -1416,18 +1469,19 @@ class F3D: self.G_MV_PMTX = 6 self.G_MV_VIEWPORT = 8 self.G_MV_LIGHT = 10 - self.G_MV_POINT = 12 - self.G_MV_MATRIX = 14 # NOTE: this is in moveword table - self.G_MVO_LOOKATX = 0 * 24 - self.G_MVO_LOOKATY = 1 * 24 - self.G_MVO_L0 = 2 * 24 - self.G_MVO_L1 = 3 * 24 - self.G_MVO_L2 = 4 * 24 - self.G_MVO_L3 = 5 * 24 - self.G_MVO_L4 = 6 * 24 - self.G_MVO_L5 = 7 * 24 - self.G_MVO_L6 = 8 * 24 - self.G_MVO_L7 = 9 * 24 + if not F3DEX_GBI_3: + self.G_MV_POINT = 12 + self.G_MV_MATRIX = 14 # NOTE: this is in moveword table + self.G_MVO_LOOKATX = 0 * 24 + self.G_MVO_LOOKATY = 1 * 24 + self.G_MVO_L0 = 2 * 24 + self.G_MVO_L1 = 3 * 24 + self.G_MVO_L2 = 4 * 24 + self.G_MVO_L3 = 5 * 24 + self.G_MVO_L4 = 6 * 24 + self.G_MVO_L5 = 7 * 24 + self.G_MVO_L6 = 8 * 24 + self.G_MVO_L7 = 9 * 24 else: self.G_MV_VIEWPORT = 0x80 self.G_MV_LOOKATY = 0x82 @@ -1454,17 +1508,24 @@ class F3D: an immediate word will be stored. """ - self.G_MW_MATRIX = 0x00 # NOTE: also used by movemem + if F3DEX_GBI_3: + self.G_MW_FX = 0x00 + else: + self.G_MW_MATRIX = 0x00 # NOTE: also used by movemem self.G_MW_NUMLIGHT = 0x02 - self.G_MW_CLIP = 0x04 + if F3DEX_GBI_3: + self.G_MW_PERSPNORM = 0x04 + else: + self.G_MW_CLIP = 0x04 self.G_MW_SEGMENT = 0x06 self.G_MW_FOG = 0x08 self.G_MW_LIGHTCOL = 0x0A - if F3DEX_GBI_2: - self.G_MW_FORCEMTX = 0x0C - else: - self.G_MW_POINTS = 0x0C - self.G_MW_PERSPNORM = 0x0E + if not F3DEX_GBI_3: + if F3DEX_GBI_2: + self.G_MW_FORCEMTX = 0x0C + else: + self.G_MW_POINTS = 0x0C + self.G_MW_PERSPNORM = 0x0E # These are offsets from the address in the dmem table @@ -1493,7 +1554,26 @@ class F3D: self.G_MWO_aLIGHT_1 = 0x00 self.G_MWO_bLIGHT_1 = 0x04 - if F3DEX_GBI_2: + if F3DEX_GBI_3: + self.G_MWO_aLIGHT_2 = 0x10 + self.G_MWO_bLIGHT_2 = 0x14 + self.G_MWO_aLIGHT_3 = 0x20 + self.G_MWO_bLIGHT_3 = 0x24 + self.G_MWO_aLIGHT_4 = 0x30 + self.G_MWO_bLIGHT_4 = 0x34 + self.G_MWO_aLIGHT_5 = 0x40 + self.G_MWO_bLIGHT_5 = 0x44 + self.G_MWO_aLIGHT_6 = 0x50 + self.G_MWO_bLIGHT_6 = 0x54 + self.G_MWO_aLIGHT_7 = 0x60 + self.G_MWO_bLIGHT_7 = 0x64 + self.G_MWO_aLIGHT_8 = 0x70 + self.G_MWO_bLIGHT_8 = 0x74 + self.G_MWO_aLIGHT_9 = 0x80 + self.G_MWO_bLIGHT_9 = 0x84 + self.G_MWO_aLIGHT_10 = 0x90 + self.G_MWO_bLIGHT_10 = 0x94 + elif F3DEX_GBI_2: self.G_MWO_aLIGHT_2 = 0x18 self.G_MWO_bLIGHT_2 = 0x1C self.G_MWO_aLIGHT_3 = 0x30 @@ -1524,26 +1604,37 @@ class F3D: self.G_MWO_aLIGHT_8 = 0xE0 self.G_MWO_bLIGHT_8 = 0xE4 - self.G_MWO_MATRIX_XX_XY_I = 0x00 - self.G_MWO_MATRIX_XZ_XW_I = 0x04 - self.G_MWO_MATRIX_YX_YY_I = 0x08 - self.G_MWO_MATRIX_YZ_YW_I = 0x0C - self.G_MWO_MATRIX_ZX_ZY_I = 0x10 - self.G_MWO_MATRIX_ZZ_ZW_I = 0x14 - self.G_MWO_MATRIX_WX_WY_I = 0x18 - self.G_MWO_MATRIX_WZ_WW_I = 0x1C - self.G_MWO_MATRIX_XX_XY_F = 0x20 - self.G_MWO_MATRIX_XZ_XW_F = 0x24 - self.G_MWO_MATRIX_YX_YY_F = 0x28 - self.G_MWO_MATRIX_YZ_YW_F = 0x2C - self.G_MWO_MATRIX_ZX_ZY_F = 0x30 - self.G_MWO_MATRIX_ZZ_ZW_F = 0x34 - self.G_MWO_MATRIX_WX_WY_F = 0x38 - self.G_MWO_MATRIX_WZ_WW_F = 0x3C + if not F3DEX_GBI_3: + self.G_MWO_MATRIX_XX_XY_I = 0x00 + self.G_MWO_MATRIX_XZ_XW_I = 0x04 + self.G_MWO_MATRIX_YX_YY_I = 0x08 + self.G_MWO_MATRIX_YZ_YW_I = 0x0C + self.G_MWO_MATRIX_ZX_ZY_I = 0x10 + self.G_MWO_MATRIX_ZZ_ZW_I = 0x14 + self.G_MWO_MATRIX_WX_WY_I = 0x18 + self.G_MWO_MATRIX_WZ_WW_I = 0x1C + self.G_MWO_MATRIX_XX_XY_F = 0x20 + self.G_MWO_MATRIX_XZ_XW_F = 0x24 + self.G_MWO_MATRIX_YX_YY_F = 0x28 + self.G_MWO_MATRIX_YZ_YW_F = 0x2C + self.G_MWO_MATRIX_ZX_ZY_F = 0x30 + self.G_MWO_MATRIX_ZZ_ZW_F = 0x34 + self.G_MWO_MATRIX_WX_WY_F = 0x38 + self.G_MWO_MATRIX_WZ_WW_F = 0x3C + self.G_MWO_POINT_RGBA = 0x10 self.G_MWO_POINT_ST = 0x14 self.G_MWO_POINT_XYSCREEN = 0x18 self.G_MWO_POINT_ZSCREEN = 0x1C + + if F3DEX_GBI_3: + self.G_MWO_AMB_OCCLUSION = 0x00 + self.G_MWO_FRESNEL = 0x04 + self.G_MWO_ATTR_OFFSET_ST = 0x08 + self.G_MWO_ATTR_OFFSET_Z = 0x0C + self.G_MWO_NORMALS_MODE = 0x0E + self.G_MWO_ALPHA_COMPARE_CULL = 0x12 + self.G_MWO_BOUNDING_FLAGS = 0x18 # Texturing macros @@ -1584,34 +1675,29 @@ class F3D: else: self.G_TX_LDBLK_MAX_TXL = 2047 - # Clipping Macros - self.FR_NEG_FRUSTRATIO_1 = 0x00000001 - self.FR_POS_FRUSTRATIO_1 = 0x0000FFFF - self.FR_NEG_FRUSTRATIO_2 = 0x00000002 - self.FR_POS_FRUSTRATIO_2 = 0x0000FFFE - self.FR_NEG_FRUSTRATIO_3 = 0x00000003 - self.FR_POS_FRUSTRATIO_3 = 0x0000FFFD - self.FR_NEG_FRUSTRATIO_4 = 0x00000004 - self.FR_POS_FRUSTRATIO_4 = 0x0000FFFC - self.FR_NEG_FRUSTRATIO_5 = 0x00000005 - self.FR_POS_FRUSTRATIO_5 = 0x0000FFFB - self.FR_NEG_FRUSTRATIO_6 = 0x00000006 - self.FR_POS_FRUSTRATIO_6 = 0x0000FFFA + if not F3DEX_GBI_3: + # Clipping Macros + self.FR_NEG_FRUSTRATIO_1 = 0x00000001 + self.FR_POS_FRUSTRATIO_1 = 0x0000FFFF + self.FR_NEG_FRUSTRATIO_2 = 0x00000002 + self.FR_POS_FRUSTRATIO_2 = 0x0000FFFE + self.FR_NEG_FRUSTRATIO_3 = 0x00000003 + self.FR_POS_FRUSTRATIO_3 = 0x0000FFFD + self.FR_NEG_FRUSTRATIO_4 = 0x00000004 + self.FR_POS_FRUSTRATIO_4 = 0x0000FFFC + self.FR_NEG_FRUSTRATIO_5 = 0x00000005 + self.FR_POS_FRUSTRATIO_5 = 0x0000FFFB + self.FR_NEG_FRUSTRATIO_6 = 0x00000006 + self.FR_POS_FRUSTRATIO_6 = 0x0000FFFA self.G_BZ_PERSP = 0 self.G_BZ_ORTHO = 1 # Lighting Macros - self.numLights = { - "NUMLIGHTS_0": 1, - "NUMLIGHTS_1": 1, - "NUMLIGHTS_2": 2, - "NUMLIGHTS_3": 3, - "NUMLIGHTS_4": 4, - "NUMLIGHTS_5": 5, - "NUMLIGHTS_6": 6, - "NUMLIGHTS_7": 7, - } + if F3DEX_GBI_3: + self.numLights = {"NUMLIGHTS_" + str(n): n for n in range(10)} + else: + self.numLights = {"NUMLIGHTS_" + str(n): (1 if n == 0 else n) for n in range(8)} def GBL_c1(self, m1a, m1b, m2a, m2b): return (m1a) << 30 | (m1b) << 26 | (m2a) << 22 | (m2b) << 18 @@ -1648,48 +1734,28 @@ class F3D: return int(((1 << self.G_TX_DXT_FRAC) + self.TXL2WORDS_4b(width) - 1) / self.TXL2WORDS_4b(width)) def NUML(self, n): + if self.F3DEX_GBI_3: + return n * 0x10 nVal = self.numLights[n] return ((nVal) * 24) if self.F3DEX_GBI_2 else (((nVal) + 1) * 32 + 0x80000000) def getLightMWO_a(self, n): - if n == "G_MWO_aLIGHT_1": - return self.G_MWO_aLIGHT_1 - elif n == "G_MWO_aLIGHT_2": - return self.G_MWO_aLIGHT_2 - elif n == "G_MWO_aLIGHT_3": - return self.G_MWO_aLIGHT_3 - elif n == "G_MWO_aLIGHT_4": - return self.G_MWO_aLIGHT_4 - elif n == "G_MWO_aLIGHT_5": - return self.G_MWO_aLIGHT_5 - elif n == "G_MWO_aLIGHT_6": - return self.G_MWO_aLIGHT_6 - elif n == "G_MWO_aLIGHT_7": - return self.G_MWO_aLIGHT_7 - elif n == "G_MWO_aLIGHT_8": - return self.G_MWO_aLIGHT_8 + if n.startswith("G_MWO_aLIGHT_") and hasattr(self, n): + return getattr(self, n) else: raise PluginError("Invalid G_MWO_a value for lights: " + n) def getLightMWO_b(self, n): - if n == "G_MWO_bLIGHT_1": - return self.G_MWO_bLIGHT_1 - elif n == "G_MWO_bLIGHT_2": - return self.G_MWO_bLIGHT_2 - elif n == "G_MWO_bLIGHT_3": - return self.G_MWO_bLIGHT_3 - elif n == "G_MWO_bLIGHT_4": - return self.G_MWO_bLIGHT_4 - elif n == "G_MWO_bLIGHT_5": - return self.G_MWO_bLIGHT_5 - elif n == "G_MWO_bLIGHT_6": - return self.G_MWO_bLIGHT_6 - elif n == "G_MWO_bLIGHT_7": - return self.G_MWO_bLIGHT_7 - elif n == "G_MWO_bLIGHT_8": - return self.G_MWO_bLIGHT_8 + if n.startswith("G_MWO_bLIGHT_") and hasattr(self, n): + return getattr(self, n) else: raise PluginError("Invalid G_MWO_b value for lights: " + n) + + def _DLHINTVALUE(self, count: int) -> int: + remainderCommands = count % self.G_INPUT_BUFFER_CMDS + if not self.F3DEX_GBI_3 or count == 0 or remainderCommands == 0: + return 0 + return (self.G_INPUT_BUFFER_CMDS - remainderCommands) << 3 g_F3D = {"GBI": None, "f3d_type": None, "isHWv1": None} @@ -1995,10 +2061,11 @@ class GfxFormatter: class Vtx: - def __init__(self, position, uv, colorOrNormal): + def __init__(self, position, uv, colorOrNormal, packedNormal = 0): self.position = position self.uv = uv self.colorOrNormal = colorOrNormal + self.packedNormal = packedNormal def to_binary(self): signX = 1 if self.uv[0] >= 0 else -1 @@ -2008,7 +2075,7 @@ class Vtx: self.position[0].to_bytes(2, "big", signed=True) + self.position[1].to_bytes(2, "big", signed=True) + self.position[2].to_bytes(2, "big", signed=True) - + bytearray([0x00, 0x00]) + + self.packedNormal.to_bytes(2, "big", signed=True) + uv[0].to_bytes(2, "big", signed=True) + uv[1].to_bytes(2, "big", signed=True) + bytearray(self.colorOrNormal) @@ -2018,7 +2085,8 @@ class Vtx: def spc(x): return "{" + ", ".join([str(a) for a in x]) + "}" - return "{{ " + ", ".join([spc(self.position), "0", spc(self.uv), spc(self.colorOrNormal)]) + " }}" + flag = "0" if self.packedNormal == 0 else hex(self.packedNormal) + return "{{ " + ", ".join([spc(self.position), flag, spc(self.uv), spc(self.colorOrNormal)]) + " }}" class VtxList: @@ -3069,8 +3137,9 @@ class Hilite: class Lights: - def __init__(self, name): + def __init__(self, name, f3d): self.name = name + self.f3d = f3d self.startAddress = 0 self.a = None self.l = [] @@ -3086,21 +3155,36 @@ class Lights: romfile.write(self.to_binary()) def size(self): - return max(len(self.l), 1) * LIGHT_SIZE + AMBIENT_SIZE + if self.f3d.F3DEX_GBI_3: + count = len(self.l) + else: + count = max(len(self.l), 1) + return count * LIGHT_SIZE + AMBIENT_SIZE def getLightPointer(self, i): - return self.startAddress + AMBIENT_SIZE + i * LIGHT_SIZE + if self.f3d.F3DEX_GBI_3: + return self.startAddress + i * LIGHT_SIZE + else: + return self.startAddress + AMBIENT_SIZE + i * LIGHT_SIZE def getAmbientPointer(self): - return self.startAddress + if self.f3d.F3DEX_GBI_3: + return self.startAddress + len(self.l) * LIGHT_SIZE + else: + return self.startAddress def to_binary(self): - data = self.a.to_binary() - if len(self.l) == 0: + ambientData = self.a.to_binary() + data = bytes() + if len(self.l) == 0 and not self.f3d.F3DEX_GBI_3: data += Light([0, 0, 0], [0, 0, 0]).to_binary() else: for i in range(len(self.l)): data += self.l[i].to_binary() + if self.f3d.F3DEX_GBI_3: + data = data + ambientData + else: + data = ambientData + data return data def to_c(self): @@ -3115,8 +3199,10 @@ class Lights: class LookAt: - def __init__(self, name): + # F3DEX3 TODO: update this + def __init__(self, name, f3d): self.name = name + self.f3d = f3d self.startAddress = 0 self.l = [] # 2 lights @@ -3141,7 +3227,7 @@ class LookAt: + spc(self.l[1].color) + "}, 0, " + "{" - + spc(self.l[0].normal) + + spc(self.l[1].normal) + "}, 0}}" + "}}\n" ) @@ -3369,6 +3455,9 @@ class SPViewport(GbiMacro): return gsDma1p(f3d.G_MOVEMEM, vpPtr, VP_SIZE, f3d.G_MV_VIEWPORT) +# F3DEX3 TODO: Encoding of hints (and generation of the hint values) + + @dataclass(unsafe_hash=True) class SPDisplayList(GbiMacro): displayList: GfxList @@ -3400,6 +3489,13 @@ class SPBranchList(GbiMacro): return gsDma1p(f3d.G_DL, dlPtr, 0, f3d.G_DL_NOPUSH) +@dataclass(unsafe_hash=True) +class SPEndDisplayList(GbiMacro): + def to_binary(self, f3d, segments): + words = _SHIFTL(f3d.G_ENDDL, 24, 8), 0 + return words[0].to_bytes(4, "big") + words[1].to_bytes(4, "big") + + # SPSprite2DBase @@ -3519,7 +3615,9 @@ class SPLine3D(GbiMacro): flag: int def to_binary(self, f3d, segments): - if f3d.F3DEX_GBI_2: + if f3d.F3DEX_GBI_3: + raise PluginError("SPLine3D is removed in F3DEX3") + elif f3d.F3DEX_GBI_2: words = _SHIFTL(f3d.G_LINE3D, 24, 8) | _gsSPLine3D_w1f(self.v0, self.v1, 0, self.flag, f3d), 0 else: words = _SHIFTL(f3d.G_LINE3D, 24, 8), _gsSPLine3D_w1f(self.v0, self.v1, 0, self.flag, f3d) @@ -3534,7 +3632,9 @@ class SPLineW3D(GbiMacro): flag: int def to_binary(self, f3d, segments): - if f3d.F3DEX_GBI_2: + if f3d.F3DEX_GBI_3: + raise PluginError("SPLineW3D is removed in F3DEX3") + elif f3d.F3DEX_GBI_2: words = _SHIFTL(f3d.G_LINE3D, 24, 8) | _gsSPLine3D_w1f(self.v0, self.v1, self.wd, self.flag, f3d), 0 else: words = _SHIFTL(f3d.G_LINE3D, 24, 8), _gsSPLine3D_w1f(self.v0, self.v1, self.wd, self.flag, f3d) @@ -3566,6 +3666,10 @@ class SP2Triangles(GbiMacro): return words[0].to_bytes(4, "big") + words[1].to_bytes(4, "big") +# F3DEX3 TODO: Encoding of _g*SP5Triangles commands (SPTriangleStrip, SPTriangleFan) +# and support for these in export including tri reordering + + @dataclass(unsafe_hash=True) class SPCullDisplayList(GbiMacro): vstart: int @@ -3597,6 +3701,9 @@ class SPClipRatio(GbiMacro): ratio: int def to_binary(self, f3d, segments): + if f3d.F3DEX_GBI_3: + return gsSPNoOp(f3d) + # These values are supposed to be flipped. shortRatioPos = int.from_bytes((-self.ratio).to_bytes(2, "big", signed=True), "big", signed=False) shortRatioNeg = int.from_bytes(self.ratio.to_bytes(2, "big", signed=True), "big", signed=False) @@ -3616,6 +3723,78 @@ class SPClipRatio(GbiMacro): # SPForceMatrix +@dataclass(unsafe_hash=True) +class SPAmbOcclusion(GbiMacro): + amb: int + dir: int + + def to_binary(self, f3d, segments): + if not f3d.F3DEX_GBI_3: + raise PluginError("SPAmbOcclusion requires F3DEX3 microcode") + return gsMoveWd(f3d.G_MW_FX, f3d.G_MWO_AMB_OCCLUSION, + (_SHIFTL(self.amb, 16, 16) | _SHIFTL(self.dir, 0, 16)), f3d) + + +@dataclass(unsafe_hash=True) +class SPFresnel(GbiMacro): + offset: int + scale: int + + def to_binary(self, f3d, segments): + if not f3d.F3DEX_GBI_3: + raise PluginError("SPFresnel requires F3DEX3 microcode") + return gsMoveWd(f3d.G_MW_FX, f3d.G_MWO_FRESNEL, + (_SHIFTL(self.offset, 16, 16) | _SHIFTL(self.scale, 0, 16)), f3d) + + +@dataclass(unsafe_hash=True) +class SPAttrOffsetST(GbiMacro): + s: int + t: int + + def to_binary(self, f3d, segments): + if not f3d.F3DEX_GBI_3: + raise PluginError("SPAttrOffsetST requires F3DEX3 microcode") + return gsMoveWd(f3d.G_MW_FX, f3d.G_MWO_ATTR_OFFSET_ST, + (_SHIFTL(self.s, 16, 16) | _SHIFTL(self.t, 0, 16)), f3d) + + +@dataclass(unsafe_hash=True) +class SPAttrOffsetZ(GbiMacro): + z: int + + def to_binary(self, f3d, segments): + if not f3d.F3DEX_GBI_3: + raise PluginError("SPAttrOffsetZ requires F3DEX3 microcode") + return gsMoveWd(f3d.G_MW_FX, f3d.G_MWO_ATTR_OFFSET_Z, + (_SHIFTL(self.z, 16, 16)), f3d) + + +@dataclass(unsafe_hash=True) +class SPNormalsMode(GbiMacro): + mode: int + + def to_binary(self, f3d, segments): + if not f3d.F3DEX_GBI_3: + raise PluginError("SPNormalsMode requires F3DEX3 microcode") + return gsMoveWd(f3d.G_MW_FX, f3d.G_MWO_NORMALS_MODE, mode, f3d) + + +# F3DEX3 TODO: SPMITMatrix + + +@dataclass(unsafe_hash=True) +class SPAlphaCompareCull(GbiMacro): + mode: int + thresh: int + + def to_binary(self, f3d, segments): + if not f3d.F3DEX_GBI_3: + raise PluginError("SPAlphaCompareCull requires F3DEX3 microcode") + return gsMoveWd(f3d.G_MW_FX, f3d.G_MWO_ALPHA_COMPARE_CULL, + (_SHIFTL(self.mode, 24, 8) | _SHIFTL(self.thresh, 16, 8)), f3d) + + @dataclass(unsafe_hash=True) class SPModifyVertex(GbiMacro): vtx: int @@ -3663,6 +3842,9 @@ class SPBranchLessZraw(GbiMacro): return GFX_SIZE * 2 +# F3DEX3 TODO: SPWFarThreshold, SPBoundingVerts, SPReturnNoneVisible, +# SPPopBranchNotVisible, SPPopCallVisible, SPLoadBoundingFlags + # SPLoadUcode (RSP) # SPDma_io @@ -3687,16 +3869,32 @@ class SPLight(GbiMacro): light: int # start address of light n: str _segptrs = True # call segmented_to_virtual in to_c method + _size = LIGHT_SIZE def to_binary(self, f3d, segments): lightPtr = int.from_bytes(encodeSegmentedAddr(self.light, segments), "big") + idx = lightIndex[self.n] if f3d.F3DEX_GBI_2: - data = gsDma2p(f3d.G_MOVEMEM, lightPtr, LIGHT_SIZE, f3d.G_MV_LIGHT, lightIndex[self.n] * 24 + 24) + if f3d.F3DEX_GBI_3: + offset = (idx - 1) * 0x10 + 0x10 + else: + offset = idx * 24 + 24 + data = gsDma2p(f3d.G_MOVEMEM, lightPtr, self._size, f3d.G_MV_LIGHT, offset) else: - data = gsDma1p(f3d.G_MOVEMEM, lightPtr, LIGHT_SIZE, (lightIndex[self.n] - 1) * 2 + f3d.G_MV_L0) + data = gsDma1p(f3d.G_MOVEMEM, lightPtr, self._size, (idx - 1) * 2 + f3d.G_MV_L0) return data +@dataclass(unsafe_hash=True) +class SPAmbient(SPLight): + _size = AMBIENT_SIZE + + def to_binary(self, f3d, segments): + if not f3d.F3DEX_GBI_3: + raise PluginError("SPAmbient requires F3DEX3 microcode") + return super().to_binary(f3d, segments) + + @dataclass(unsafe_hash=True) class SPLightColor(GbiMacro): # n is macro name (string) @@ -3718,6 +3916,8 @@ class SPSetLights(GbiMacro): lights: Lights def get_ptr_offsets(self, f3d): + if f3d.F3DEX_GBI_3: + return [12] offsets = [] if len(self.lights.l) == 0: offsets = [12, 20] @@ -3730,7 +3930,15 @@ class SPSetLights(GbiMacro): def to_binary(self, f3d, segments): data = SPNumLights("NUMLIGHTS_" + str(len(self.lights.l))).to_binary(f3d, segments) - if len(self.lights.l) == 0: + if f3d.F3DEX_GBI_3: + data += gsDma2p( + f3d.G_MOVEMEM, + self.lights.startAddress, + len(self.lights.l) * 0x10 + 8, + f3d.G_MV_LIGHT, + 0x10 + ) + elif len(self.lights.l) == 0: # The light does not exist in python, but is added in # when converted to binary, making this address valid. data += SPLight(self.lights.getLightPointer(0), "LIGHT_1").to_binary(f3d, segments) @@ -3756,9 +3964,14 @@ class SPSetLights(GbiMacro): return header + ")" def size(self, f3d): - return GFX_SIZE * (2 + max(len(self.lights.l), 1)) + if f3d.F3DEX_GBI_3: + return GFX_SIZE * 2 + else: + return GFX_SIZE * (2 + max(len(self.lights.l), 1)) +# F3DEX3 TODO: SPCameraWorld + # Reflection/Hiliting Macros @@ -3782,8 +3995,11 @@ class SPLookAt(GbiMacro): _ptr_amp = True # add an ampersand to names def to_binary(self, f3d, segments): - light0Ptr = int.from_bytes(encodeSegmentedAddr(self.la.startAddress, segments), "big") - return gsSPLookAtX(light0Ptr, f3d) + gsSPLookAtY(light0Ptr + 16, f3d) + lookAtPtr = int.from_bytes(encodeSegmentedAddr(self.la.startAddress, segments), "big") + if f3d.F3DEX_GBI_3: + return gsDma2p(f3d.G_MOVEMEM, lookAtPtr, 8, f3d.G_MV_LIGHT, 8) + else: + return gsSPLookAtX(lookAtPtr, f3d) + gsSPLookAtY(lookAtPtr + 16, f3d) @dataclass(unsafe_hash=True) @@ -3896,13 +4112,6 @@ class SPPerspNormalize(GbiMacro): # SPPopMatrix -@dataclass(unsafe_hash=True) -class SPEndDisplayList(GbiMacro): - def to_binary(self, f3d, segments): - words = _SHIFTL(f3d.G_ENDDL, 24, 8), 0 - return words[0].to_bytes(4, "big") + words[1].to_bytes(4, "big") - - def gsSPGeometryMode_F3DEX_GBI_2(c, s, f3d): words = (_SHIFTL(f3d.G_GEOMETRYMODE, 24, 8) | _SHIFTL(~c, 0, 24)), s return words[0].to_bytes(4, "big") + words[1].to_bytes(4, "big") @@ -3916,32 +4125,8 @@ def gsSPGeometryMode_Non_F3DEX_GBI_2(word, f3d): def geoFlagListToWord(flagList, f3d): word = 0 for name in flagList: - if name == "G_ZBUFFER": - word += f3d.G_ZBUFFER - elif name == "G_SHADE": - word += f3d.G_SHADE - elif name == "G_TEXTURE_ENABLE": - word += f3d.G_TEXTURE_ENABLE - elif name == "G_SHADING_SMOOTH": - word += f3d.G_SHADING_SMOOTH - elif name == "G_CULL_FRONT": - word += f3d.G_CULL_FRONT - elif name == "G_CULL_BACK": - word += f3d.G_CULL_BACK - elif name == "G_CULL_BOTH": - word += f3d.G_CULL_BOTH - elif name == "G_FOG": - word += f3d.G_FOG - elif name == "G_LIGHTING": - word += f3d.G_LIGHTING - elif name == "G_TEXTURE_GEN": - word += f3d.G_TEXTURE_GEN - elif name == "G_TEXTURE_GEN_LINEAR": - word += f3d.G_TEXTURE_GEN_LINEAR - elif name == "G_LOD": - word += f3d.G_LOD - elif name == "G_CLIPPING": - word += f3d.G_CLIPPING + if name in f3d.allGeomModeFlags: + word += getattr(f3d, name) else: raise PluginError("Invalid geometry mode flag " + name) @@ -4487,6 +4672,45 @@ class DPSetPrimColor(GbiMacro): return words[0].to_bytes(4, "big") + words[1].to_bytes(4, "big") +@dataclass(unsafe_hash=True) +class SPLightToRDP(GbiMacro): + light: int + alpha: int + word0: int # word0 of the command to write, which is word1 of this command + + def to_binary(self, f3d, segments): + if not f3d.F3DEX_GBI_3: + raise PluginError("SPLightToRDP requires F3DEX3 microcode") + word = _SHIFTL(f3d.G_LIGHTTORDP, 24, 8) | _SHIFTL(self.light * 0x10, 8, 8) | _SHIFTL(self.alpha, 0, 8)) + return word.to_bytes(4, "big") + self.word0.to_bytes(4, "big") + + +@dataclass(unsafe_hash=True) +class SPLightToPrimColor(GbiMacro): + light: int + alpha: int + m: int + l: int + + def to_binary(self, f3d, segments): + if not f3d.F3DEX_GBI_3: + raise PluginError("SPLightToPrimColor requires F3DEX3 microcode") + word0 = (_SHIFTL(f3d.G_SETPRIMCOLOR, 24, 8) | _SHIFTL(self.m, 8, 8) | _SHIFTL(self.l, 0, 8)) + return SPLightToRDP(self.light, self.alpha, word0).to_binary(f3d, segments) + + +@dataclass(unsafe_hash=True) +class SPLightToEnvColor(GbiMacro): + light: int + alpha: int + + def to_binary(self, f3d, segments): + if not f3d.F3DEX_GBI_3: + raise PluginError("SPLightToEnvColor requires F3DEX3 microcode") + word0 = _SHIFTL(f3d.G_SETENVCOLOR, 24, 8) + return SPLightToRDP(self.light, self.alpha, word0).to_binary(f3d, segments) + + @dataclass(unsafe_hash=True) class DPSetOtherMode(GbiMacro): mode0: list @@ -4572,6 +4796,9 @@ class DPSetTile(GbiMacro): return self.tile == f3d.G_TX_LOADTILE +# F3DEX3 TODO: DPLoadBlockTag and putting tag values in DPLoadBlock + + @dataclass(unsafe_hash=True) class DPLoadBlock(GbiMacro): tile: int diff --git a/fast64_internal/f3d/f3d_material.py b/fast64_internal/f3d/f3d_material.py index 267e17a..79dd53a 100644 --- a/fast64_internal/f3d/f3d_material.py +++ b/fast64_internal/f3d/f3d_material.py @@ -6,7 +6,7 @@ from bpy.utils import register_class, unregister_class from mathutils import Color from .f3d_enums import * -from .f3d_gbi import get_F3D_GBI, GBL_c1, GBL_c2, enumTexScroll +from .f3d_gbi import get_F3D_GBI, GBL_c1, GBL_c2, enumTexScroll, isUcodeF3DEX1 from .f3d_material_presets import * from ..utility import * from ..render_settings import Fast64RenderSettings_Properties, update_scene_props_from_render_settings @@ -153,6 +153,30 @@ def update_draw_layer(self, context): set_output_node_groups(material) +def all_blender_uses(rdp_settings): + ''' + Returns a dictionary of the external features which the blender may or may + not use, or None if set_rendermode is disabled so we don't know. + ''' + if not rdp_settings.set_rendermode: + return None + is_one_cycle = rdp_settings.g_mdsft_cycletype == "G_CYC_1CYCLE" + if rdp_settings.rendermode_advanced_enabled: + useZ = rdp_settings.z_cmp or rdp_settings.z_upd + useShade = rdp_settings.blend_a1 == "G_BL_A_SHADE" + if not is_one_cycle: + useShade = useShade or rdp_settings.blend_a2 == "G_BL_A_SHADE" + else: + f3d = get_F3D_GBI() + r1 = getattr(f3d, rdp_settings.rendermode_preset_cycle_1, f3d.G_RM_AA_ZB_OPA_SURF) + r2 = getattr(f3d, rdp_settings.rendermode_preset_cycle_2, f3d.G_RM_AA_ZB_OPA_SURF) + if is_one_cycle: + r2 = 0 + useZ = bool((r1 | r2) & (f3d.Z_CMP | f3d.Z_UPD)) + useShade = ((r1 >> 26) & 3) == f3d.G_BL_A_SHADE or ((r2 >> 24) & 3) == f3d.G_BL_A_SHADE + return {"Shade Alpha": useShade, "Z Buffer": useZ} + + def get_blend_method(material): f3dMat = material.f3d_mat drawLayer = material.f3d_mat.draw_layer @@ -404,17 +428,99 @@ def ui_geo_mode(settings, dataHolder, layout, useDropdown): icon="TRIA_DOWN" if dataHolder.menu_geo else "TRIA_RIGHT", ) if not useDropdown or dataHolder.menu_geo: - inputGroup.prop(settings, "g_zbuffer", text="Z Buffer") - inputGroup.prop(settings, "g_shade", text="Shading") - inputGroup.prop(settings, "g_cull_front", text="Cull Front") - inputGroup.prop(settings, "g_cull_back", text="Cull Back") - inputGroup.prop(settings, "g_fog", text="Fog") - inputGroup.prop(settings, "g_lighting", text="Lighting") - inputGroup.prop(settings, "g_tex_gen", text="Texture UV Generate") - inputGroup.prop(settings, "g_tex_gen_linear", text="Texture UV Generate Linear") - inputGroup.prop(settings, "g_shade_smooth", text="Smooth Shading") - if bpy.context.scene.f3d_type == "F3DEX_GBI_2" or bpy.context.scene.f3d_type == "F3DEX_GBI": - inputGroup.prop(settings, "g_clipping", text="Clipping") + + def indentGroup(parent, textOrProp, isText: bool): + c = parent.column(align=True) + if isText: + c.label(text=textOrProp) + else: + c.prop(settings, textOrProp) + if not getattr(settings, textOrProp): + return None + c = c.split(factor=0.1) + c.label(text="") + c = c.column(align=True) + return c + + isF3DEX3 = bpy.context.scene.f3d_type == "F3DEX3" + if isinstance(dataHolder, F3DMaterialProperty): + ccWarnings = blendWarnings = True + ccUse = all_combiner_uses(dataHolder) + shadeInCC = ccUse["Shade"] or ccUse["Shade Alpha"] + blendUse = all_blender_uses(settings) + if blendUse is None: + blendWarnings = shadeInBlender = zInBlender = False + else: + shadeInBlender = blendUse["Shade Alpha"] + zInBlender = blendUse["Z Buffer"] + else: + ccWarnings = shadeInCC = False + blendWarnings = shadeInBlender = zInBlender = False + + inputGroup.prop(settings, "g_shade_smooth") + + c = indentGroup(inputGroup, "g_lighting", False) + if c is not None: + if ccWarnings and not shadeInCC and not settings.g_tex_gen: + c.label(text="Shade not used in CC, can disable lighting.", icon="INFO") + if isF3DEX3: + c.prop(settings, "g_packed_normals") + c.prop(settings, "g_ambocclusion") + d = indentGroup(c, "g_tex_gen", False) + if d is not None: + d.prop(settings, "g_tex_gen_linear") + + light_to_alpha_prereq = isF3DEX3 and settings.g_lighting + if settings.g_fog: + shadeAlphaLabel = "Fog" + elif light_to_alpha_prereq and settings.g_lighttoalpha: + shadeAlphaLabel = "Light intensity" + else: + shadeAlphaLabel = "Vtx alpha" + c = indentGroup(inputGroup, f"Shade alpha = {shadeAlphaLabel}:", True) + if light_to_alpha_prereq: + c.prop(settings, "g_lighttoalpha") + c.prop(settings, "g_fog") + if light_to_alpha_prereq and settings.g_lighttoalpha and settings.g_fog: + c.label(text="Fog overrides Light-to-Alpha.", icon="ERROR") + if blendWarnings and shadeInBlender and not settings.g_fog: + c.label(text="Rendermode uses shade alpha, probably fog.", icon="INFO") + if blendWarnings and not shadeInBlender and settings.g_fog: + c.label(text="Fog not used in rendermode / blender, can disable.", icon="INFO") + + if isF3DEX3: + c = indentGroup(inputGroup, "Attribute offsets:", True) + c.prop(settings, "g_attroffset_st_enable") + c.prop(settings, "g_attroffset_z_enable") + + c = indentGroup(inputGroup, "Face culling:", True) + c.prop(settings, "g_cull_front") + c.prop(settings, "g_cull_back") + if settings.g_cull_front and settings.g_cull_back: + c.label(text="Nothing will be drawn.", icon="ERROR") + + c = indentGroup(inputGroup, "Disable if not using:", True) + c.prop(settings, "g_zbuffer") + if blendWarnings and not settings.g_zbuffer and zInBlender: + c.label(text="Rendermode / blender using Z, must enable.", icon="ERROR") + elif blendWarnings and settings.g_zbuffer and not zInBlender: + c.label(text="Z is not being used, can disable.", icon="INFO") + c.prop(settings, "g_shade") + if ccWarnings and not settings.g_shade and (shadeInCC or shadeInBlender): + if shadeInCC and shadeInBlender: + where = "CC and blender" + elif shadeInCC: + where = "CC" + else: + where = "rendermode / blender" + c.label(text=f"Shade in use in {where}, must enable.", icon="ERROR") + elif ccWarnings and settings.g_shade and not shadeInCC and not shadeInBlender: + c.label(text="Shade is not being used, can disable.", icon="INFO") + + c = indentGroup(inputGroup, "Not useful:", True) + c.prop(settings, "g_lod") + if isUcodeF3DEX1(bpy.context.scene.f3d_type): + c.prop(settings, "g_clipping") def ui_upper_mode(settings, dataHolder, layout: bpy.types.UILayout, useDropdown): @@ -755,9 +861,44 @@ class F3DPanel(bpy.types.Panel): elif context.scene.gameEditorMode == "OOT": prop_split(layout, material.f3d_mat.draw_layer, "oot", "Draw Layer") - def ui_fog(self, f3dMat, inputCol, showCheckBox): + def ui_misc(self, f3dMat, inputCol, showCheckBox): + if f3dMat.rdp_settings.g_ambocclusion: + if showCheckBox or f3dMat.set_ao: + inputGroup = inputCol.column() + if showCheckBox: + inputGroup.prop(f3dMat, "set_ao", text="Set Ambient Occlusion") + if f3dMat.set_ao: + prop_split(inputGroup.row(), f3dMat, "ao_ambient", "AO Ambient") + prop_split(inputGroup.row(), f3dMat, "ao_directional", "AO Directional") + + if f3dMat.rdp_settings.g_fresnel: + if showCheckBox or f3dMat.set_fresnel: + inputGroup = inputCol.column() + if showCheckBox: + inputGroup.prop(f3dMat, "set_fresnel", text="Set Fresnel") + if f3dMat.set_fresnel: + prop_split(inputGroup.row(), f3dMat, "fresnel_lo", "Fresnel Lo") + prop_split(inputGroup.row(), f3dMat, "fresnel_hi", "Fresnel Hi") + + if f3dMat.rdp_settings.g_attroffset_st_enable: + if showCheckBox or f3dMat.set_attroffs_st: + inputGroup = inputCol.column() + if showCheckBox: + inputGroup.prop(f3dMat, "set_attroffs_st", text="Set ST Attr Offset") + if f3dMat.set_attroffs_st: + prop_split(inputGroup.row(), f3dMat, "attroffs_st", "ST Attr Offset") + + if f3dMat.rdp_settings.g_attroffset_z_enable: + if showCheckBox or f3dMat.set_attroffs_z: + inputGroup = inputCol.column() + if showCheckBox: + inputGroup.prop(f3dMat, "set_attroffs_z", text="Set Z Attr Offset") + if f3dMat.set_attroffs_z: + prop_split(inputGroup.row(), f3dMat, "attroffs_z", "Z Attr Offset") + if f3dMat.rdp_settings.g_fog: - inputGroup = inputCol.column() + if showCheckBox or f3dMat.set_fog: + inputGroup = inputCol.column() if showCheckBox: inputGroup.prop(f3dMat, "set_fog", text="Set Fog") if f3dMat.set_fog: @@ -765,12 +906,8 @@ class F3DPanel(bpy.types.Panel): if f3dMat.use_global_fog: inputGroup.label(text="Only applies to levels (area fog settings).", icon="INFO") else: - fogColorGroup = inputGroup.row().split(factor=0.5) - fogColorGroup.label(text="Fog Color") - fogColorGroup.prop(f3dMat, "fog_color", text="") - fogPositionGroup = inputGroup.row().split(factor=0.5) - fogPositionGroup.label(text="Fog Range") - fogPositionGroup.prop(f3dMat, "fog_position", text="") + prop_split(inputGroup.row(), f3dMat, "fog_color", "Fog Color") + prop_split(inputGroup.row(), f3dMat, "fog_position", "Fog Range") def drawVertexColorNotice(self, layout): noticeBox = layout.box().column() @@ -836,8 +973,7 @@ class F3DPanel(bpy.types.Panel): if useDict["Convert"] and f3dMat.set_k0_5: self.ui_convert(f3dMat, inputCol, False) - if f3dMat.set_fog: - self.ui_fog(f3dMat, inputCol, False) + self.ui_misc(f3dMat, inputCol, False) def draw_full(self, f3dMat, material, layout: bpy.types.UILayout, context): layout.row().prop(material, "menu_tab", expand=True) @@ -936,7 +1072,7 @@ class F3DPanel(bpy.types.Panel): if useDict["Convert"]: self.ui_convert(f3dMat, inputCol, True) - self.ui_fog(f3dMat, inputCol, True) + self.ui_misc(f3dMat, inputCol, True) if menuTab == "Geo": ui_geo_mode(f3dMat.rdp_settings, f3dMat, layout, False) @@ -2547,6 +2683,7 @@ class RDPSettings(bpy.types.PropertyGroup): # v1/2 difference g_cull_front: bpy.props.BoolProperty( name="Cull Front", + default=False, update=update_node_values_with_preset, description="Disables drawing of front faces" ) @@ -2557,8 +2694,45 @@ class RDPSettings(bpy.types.PropertyGroup): update=update_node_values_with_preset, description="Disables drawing of back faces" ) + g_attroffset_st_enable: bpy.props.BoolProperty( + name="ST Offset (for UV scroll)", + default=False, + update=update_node_values_with_preset, + description="F3DEX3: Enables offsets to vertex ST values, usually for UV scrolling" + ) + g_attroffset_z_enable: bpy.props.BoolProperty( + name="Z Offset (for decal fix)", + default=False, + update=update_node_values_with_preset, + description="F3DEX3: Enables offset to vertex Z. To fix decals, set the Z mode to opaque and enable this" + ) + g_packed_normals: bpy.props.BoolProperty( + name="Packed Normals (Vtx Colors + Lighting)", + default=False, + update=update_node_values_with_preset, + description="F3DEX3: Packs vertex normals in unused 16 bits of each vertex, enabling simultaneous vertex colors and lighting" + ) + g_lighttoalpha: bpy.props.BoolProperty( + name="Light to Alpha (for cel shading)", + default=False, + update=update_node_values_with_preset, + description="F3DEX3: Moves light intensity to shade alpha, used for cel shading and other effects" + ) + g_ambocclusion: bpy.props.BoolProperty( + name="Ambient Occlusion", + default=False, + update=update_node_values_with_preset, + description="F3DEX3: Scales ambient and/or directional light intensity with vertex alpha. Bake scene shadows / AO into vertex alpha, not vertex color" + ) + g_fresnel: bpy.props.BoolProperty( + name="Fresnel", + default=False, + update=update_node_values_with_preset, + description="F3DEX3: Shade alpha derived from how much each vertex normal faces the camera. For water and toon outlines" + ) g_fog: bpy.props.BoolProperty( name="Fog", + default=False, update=update_node_values_with_preset, description="Turns on/off fog calculation. Fog variable gets stored into shade alpha" ) @@ -2566,29 +2740,37 @@ class RDPSettings(bpy.types.PropertyGroup): name="Lighting", default=True, update=update_node_values_with_preset, - description="Enables calculation shade color using lights. Turn off for vertex colors as shade color" + description="Enables calculating shade color using lights. Turn off for vertex colors as shade color" ) g_tex_gen: bpy.props.BoolProperty( name="Texture UV Generate", + default=False, update=update_node_values_with_preset, description="Generates texture coordinates for reflection mapping based on vertex normals and lookat direction. On a skybox texture, maps the sky to the center of the texture and the ground to a circle inscribed in the border. Requires lighting enabled to use" ) g_tex_gen_linear: bpy.props.BoolProperty( name="Texture UV Generate Linear", + default=False, update=update_node_values_with_preset, description="Modifies the texgen mapping; enable with texgen. Use a normal panorama image for the texture, with the sky at the top and the ground at the bottom. Requires lighting enabled to use" ) - # v1/2 difference + g_lod: bpy.props.BoolProperty( + name="LoD (does nothing)", + default=False, + update=update_node_values_with_preset, + description="Not implemented in any known microcodes. No effect whether enabled or disabled" + ) g_shade_smooth: bpy.props.BoolProperty( name="Smooth Shading", default=True, update=update_node_values_with_preset, description="Shades primitive smoothly using interpolation between shade values for each vertex (Gouraud shading)" ) - # f3dlx2 only g_clipping: bpy.props.BoolProperty( name="Clipping", + default=False, update=update_node_values_with_preset, + description="F3DEX1/LX only, exact function unknown" ) # upper half mode @@ -2832,10 +3014,16 @@ class RDPSettings(bpy.types.PropertyGroup): self.g_shade, self.g_cull_front, self.g_cull_back, + self.g_attroffset_st_enable, + self.g_attroffset_z_enable, + self.g_packed_normals, + self.g_lighttoalpha, + self.g_ambocclusion, self.g_fog, self.g_lighting, self.g_tex_gen, self.g_tex_gen_linear, + self.g_lod, self.g_shade_smooth, self.g_clipping, self.g_mdsft_alpha_dither, @@ -3528,6 +3716,65 @@ class F3DMaterialProperty(bpy.types.PropertyGroup): f3d_light6: bpy.props.PointerProperty(type=bpy.types.Light, update=F3DOrganizeLights) f3d_light7: bpy.props.PointerProperty(type=bpy.types.Light, update=F3DOrganizeLights) + # Ambient Occlusion + ao_ambient: bpy.props.FloatProperty( + name="AO Ambient", + min=0.0, + max=1.0, + default=1.0, + description="How much ambient occlusion (vertex alpha) affects ambient light intensity", + update=update_node_values_without_preset, + ) + ao_directional: bpy.props.FloatProperty( + name="AO Directional", + min=0.0, + max=1.0, + default=0.625, + description="How much ambient occlusion (vertex alpha) affects directional light intensity", + update=update_node_values_without_preset, + ) + set_ao: bpy.props.BoolProperty(update=update_node_values_without_preset) + + # Fresnel + fresnel_lo: bpy.props.FloatProperty( + name="Fresnel lo", + min=0.0, + max=1.0, + default=0.7, + description="Dot product value which gives shade alpha = 0. The dot product ranges from 1 when the normal points directly at the camera, to 0 when it points sideways", + update=update_node_values_without_preset, + ) + fresnel_hi: bpy.props.FloatProperty( + name="Fresnel hi", + min=0.0, + max=1.0, + default=0.4, + description="Dot product value which gives shade alpha = FF. The dot product ranges from 1 when the normal points directly at the camera, to 0 when it points sideways", + update=update_node_values_without_preset, + ) + set_fresnel: bpy.props.BoolProperty(update=update_node_values_without_preset) + + # Attribute Offsets + attroffs_st: bpy.props.FloatVectorProperty( + name="ST Attr Offset", + size=2, + min=-1024.0, + max=1024.0, + default=(0.0, 0.0), + description="Offset applied to ST (UV) coordinates, after texture scale. Units are texels. Usually for UV scrolling", + update=update_node_values_without_preset, + ) + attroffs_z: bpy.props.IntProperty( + name="Z Attr Offset", + min=-0x8000, + max=0x7FFF, + default=-2, + description="Offset applied to Z coordinate. To fix decals, set Z mode to opaque and set Z attr offset to something like -2", + update=update_node_values_without_preset, + ) + set_attroffs_st: bpy.props.BoolProperty(update=update_node_values_without_preset) + set_attroffs_z: bpy.props.BoolProperty(update=update_node_values_without_preset) + # Fog Properties fog_color: bpy.props.FloatVectorProperty( name="Fog Color", @@ -3600,6 +3847,10 @@ class F3DMaterialProperty(bpy.types.PropertyGroup): round(self.k5, 4) if self.set_k0_5 else None, self.combiner1.key() if self.set_combiner else None, self.combiner2.key() if self.set_combiner else None, + tuple([round(value, 4) for value in (self.ao_ambient, self.ao_directional)]) if self.set_ao else None, + tuple([round(value, 4) for value in (self.fresnel_lo, self.fresnel_hi)]) if self.set_fresnel else None, + tuple([round(value, 4) for value in self.attroffs_st]) if self.set_attroffs_st else None, + self.attroffs_z if self.set_attroffs_z else None, tuple([round(value, 4) for value in self.fog_color]) if self.set_fog else None, tuple([round(value, 4) for value in self.fog_position]) if self.set_fog else None, tuple([round(value, 4) for value in self.default_light_color]) if useDefaultLighting else None, diff --git a/fast64_internal/f3d/f3d_material_presets.py b/fast64_internal/f3d/f3d_material_presets.py index aa3e269..20794e5 100644 --- a/fast64_internal/f3d/f3d_material_presets.py +++ b/fast64_internal/f3d/f3d_material_presets.py @@ -57,6 +57,9 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None +f3d_mat.ao_ambient = 1.0 +f3d_mat.ao_directional = 0.625 +f3d_mat.set_ao = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False @@ -66,10 +69,17 @@ f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = True +f3d_mat.rdp_settings.g_attroffset_st_enable = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_packed_normals = False +f3d_mat.rdp_settings.g_lighttoalpha = False +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_fresnel = False f3d_mat.rdp_settings.g_fog = True f3d_mat.rdp_settings.g_lighting = True f3d_mat.rdp_settings.g_tex_gen = True f3d_mat.rdp_settings.g_tex_gen_linear = False +f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' @@ -175,6 +185,9 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None +f3d_mat.ao_ambient = 1.0 +f3d_mat.ao_directional = 0.625 +f3d_mat.set_ao = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False @@ -184,10 +197,17 @@ f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_packed_normals = False +f3d_mat.rdp_settings.g_lighttoalpha = False +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_fresnel = False f3d_mat.rdp_settings.g_fog = True f3d_mat.rdp_settings.g_lighting = True f3d_mat.rdp_settings.g_tex_gen = True f3d_mat.rdp_settings.g_tex_gen_linear = False +f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' @@ -293,6 +313,9 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None +f3d_mat.ao_ambient = 1.0 +f3d_mat.ao_directional = 0.625 +f3d_mat.set_ao = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False @@ -302,10 +325,17 @@ f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = True +f3d_mat.rdp_settings.g_attroffset_st_enable = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_packed_normals = False +f3d_mat.rdp_settings.g_lighttoalpha = False +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_fresnel = False f3d_mat.rdp_settings.g_fog = True f3d_mat.rdp_settings.g_lighting = True f3d_mat.rdp_settings.g_tex_gen = False f3d_mat.rdp_settings.g_tex_gen_linear = False +f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' @@ -411,6 +441,9 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None +f3d_mat.ao_ambient = 1.0 +f3d_mat.ao_directional = 0.625 +f3d_mat.set_ao = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False @@ -420,10 +453,17 @@ f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_packed_normals = False +f3d_mat.rdp_settings.g_lighttoalpha = False +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_fresnel = False f3d_mat.rdp_settings.g_fog = True f3d_mat.rdp_settings.g_lighting = True f3d_mat.rdp_settings.g_tex_gen = False f3d_mat.rdp_settings.g_tex_gen_linear = False +f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' @@ -529,6 +569,9 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None +f3d_mat.ao_ambient = 1.0 +f3d_mat.ao_directional = 0.625 +f3d_mat.set_ao = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False @@ -538,10 +581,17 @@ f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = True +f3d_mat.rdp_settings.g_attroffset_st_enable = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_packed_normals = False +f3d_mat.rdp_settings.g_lighttoalpha = False +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_fresnel = False f3d_mat.rdp_settings.g_fog = True f3d_mat.rdp_settings.g_lighting = True f3d_mat.rdp_settings.g_tex_gen = False f3d_mat.rdp_settings.g_tex_gen_linear = False +f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' @@ -647,6 +697,9 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None +f3d_mat.ao_ambient = 1.0 +f3d_mat.ao_directional = 0.625 +f3d_mat.set_ao = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False @@ -656,10 +709,17 @@ f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_packed_normals = False +f3d_mat.rdp_settings.g_lighttoalpha = False +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_fresnel = False f3d_mat.rdp_settings.g_fog = True f3d_mat.rdp_settings.g_lighting = True f3d_mat.rdp_settings.g_tex_gen = False f3d_mat.rdp_settings.g_tex_gen_linear = False +f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' @@ -765,6 +825,9 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None +f3d_mat.ao_ambient = 1.0 +f3d_mat.ao_directional = 0.625 +f3d_mat.set_ao = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False @@ -774,10 +837,17 @@ f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = True +f3d_mat.rdp_settings.g_attroffset_st_enable = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_packed_normals = False +f3d_mat.rdp_settings.g_lighttoalpha = False +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_fresnel = False f3d_mat.rdp_settings.g_fog = True f3d_mat.rdp_settings.g_lighting = True f3d_mat.rdp_settings.g_tex_gen = False f3d_mat.rdp_settings.g_tex_gen_linear = False +f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' @@ -883,6 +953,9 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None +f3d_mat.ao_ambient = 1.0 +f3d_mat.ao_directional = 0.625 +f3d_mat.set_ao = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False @@ -892,10 +965,17 @@ f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_packed_normals = False +f3d_mat.rdp_settings.g_lighttoalpha = False +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_fresnel = False f3d_mat.rdp_settings.g_fog = True f3d_mat.rdp_settings.g_lighting = True f3d_mat.rdp_settings.g_tex_gen = False f3d_mat.rdp_settings.g_tex_gen_linear = False +f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' @@ -1001,6 +1081,9 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None +f3d_mat.ao_ambient = 1.0 +f3d_mat.ao_directional = 0.625 +f3d_mat.set_ao = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False @@ -1010,10 +1093,17 @@ f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_packed_normals = False +f3d_mat.rdp_settings.g_lighttoalpha = False +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_fresnel = False f3d_mat.rdp_settings.g_fog = True f3d_mat.rdp_settings.g_lighting = True f3d_mat.rdp_settings.g_tex_gen = False f3d_mat.rdp_settings.g_tex_gen_linear = False +f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' @@ -1119,6 +1209,9 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None +f3d_mat.ao_ambient = 1.0 +f3d_mat.ao_directional = 0.625 +f3d_mat.set_ao = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False @@ -1128,10 +1221,17 @@ f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = True +f3d_mat.rdp_settings.g_attroffset_st_enable = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_packed_normals = False +f3d_mat.rdp_settings.g_lighttoalpha = False +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_fresnel = False f3d_mat.rdp_settings.g_fog = True f3d_mat.rdp_settings.g_lighting = True f3d_mat.rdp_settings.g_tex_gen = False f3d_mat.rdp_settings.g_tex_gen_linear = False +f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' @@ -1237,6 +1337,9 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None +f3d_mat.ao_ambient = 1.0 +f3d_mat.ao_directional = 0.625 +f3d_mat.set_ao = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False @@ -1246,10 +1349,17 @@ f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_packed_normals = False +f3d_mat.rdp_settings.g_lighttoalpha = False +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_fresnel = False f3d_mat.rdp_settings.g_fog = True f3d_mat.rdp_settings.g_lighting = True f3d_mat.rdp_settings.g_tex_gen = False f3d_mat.rdp_settings.g_tex_gen_linear = False +f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' @@ -1355,6 +1465,9 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None +f3d_mat.ao_ambient = 1.0 +f3d_mat.ao_directional = 0.625 +f3d_mat.set_ao = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False @@ -1364,10 +1477,17 @@ f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_packed_normals = False +f3d_mat.rdp_settings.g_lighttoalpha = False +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_fresnel = False f3d_mat.rdp_settings.g_fog = True f3d_mat.rdp_settings.g_lighting = True f3d_mat.rdp_settings.g_tex_gen = False f3d_mat.rdp_settings.g_tex_gen_linear = False +f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' @@ -1473,6 +1593,9 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None +f3d_mat.ao_ambient = 1.0 +f3d_mat.ao_directional = 0.625 +f3d_mat.set_ao = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False @@ -1482,10 +1605,17 @@ f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = True +f3d_mat.rdp_settings.g_attroffset_st_enable = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_packed_normals = False +f3d_mat.rdp_settings.g_lighttoalpha = False +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_fresnel = False f3d_mat.rdp_settings.g_fog = True f3d_mat.rdp_settings.g_lighting = False f3d_mat.rdp_settings.g_tex_gen = False f3d_mat.rdp_settings.g_tex_gen_linear = False +f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' @@ -1591,6 +1721,9 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None +f3d_mat.ao_ambient = 1.0 +f3d_mat.ao_directional = 0.625 +f3d_mat.set_ao = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False @@ -1600,10 +1733,17 @@ f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_packed_normals = False +f3d_mat.rdp_settings.g_lighttoalpha = False +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_fresnel = False f3d_mat.rdp_settings.g_fog = True f3d_mat.rdp_settings.g_lighting = False f3d_mat.rdp_settings.g_tex_gen = False f3d_mat.rdp_settings.g_tex_gen_linear = False +f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' @@ -1709,6 +1849,9 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None +f3d_mat.ao_ambient = 1.0 +f3d_mat.ao_directional = 0.625 +f3d_mat.set_ao = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False @@ -1718,10 +1861,17 @@ f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_packed_normals = False +f3d_mat.rdp_settings.g_lighttoalpha = False +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_fresnel = False f3d_mat.rdp_settings.g_fog = True f3d_mat.rdp_settings.g_lighting = False f3d_mat.rdp_settings.g_tex_gen = False f3d_mat.rdp_settings.g_tex_gen_linear = False +f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' @@ -1827,6 +1977,9 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None +f3d_mat.ao_ambient = 1.0 +f3d_mat.ao_directional = 0.625 +f3d_mat.set_ao = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False @@ -1836,10 +1989,17 @@ f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = True +f3d_mat.rdp_settings.g_attroffset_st_enable = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_packed_normals = False +f3d_mat.rdp_settings.g_lighttoalpha = False +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_fresnel = False f3d_mat.rdp_settings.g_fog = False f3d_mat.rdp_settings.g_lighting = True f3d_mat.rdp_settings.g_tex_gen = False f3d_mat.rdp_settings.g_tex_gen_linear = False +f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' @@ -1944,6 +2104,9 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None +f3d_mat.ao_ambient = 1.0 +f3d_mat.ao_directional = 0.625 +f3d_mat.set_ao = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False @@ -1953,10 +2116,17 @@ f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = True +f3d_mat.rdp_settings.g_attroffset_st_enable = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_packed_normals = False +f3d_mat.rdp_settings.g_lighttoalpha = False +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_fresnel = False f3d_mat.rdp_settings.g_fog = False f3d_mat.rdp_settings.g_lighting = True f3d_mat.rdp_settings.g_tex_gen = True f3d_mat.rdp_settings.g_tex_gen_linear = False +f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' @@ -2061,6 +2231,9 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None +f3d_mat.ao_ambient = 1.0 +f3d_mat.ao_directional = 0.625 +f3d_mat.set_ao = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = True @@ -2070,10 +2243,17 @@ f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = True +f3d_mat.rdp_settings.g_attroffset_st_enable = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_packed_normals = False +f3d_mat.rdp_settings.g_lighttoalpha = False +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_fresnel = False f3d_mat.rdp_settings.g_fog = True f3d_mat.rdp_settings.g_lighting = True f3d_mat.rdp_settings.g_tex_gen = False f3d_mat.rdp_settings.g_tex_gen_linear = False +f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' @@ -2178,6 +2358,9 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None +f3d_mat.ao_ambient = 1.0 +f3d_mat.ao_directional = 0.625 +f3d_mat.set_ao = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = True @@ -2187,10 +2370,17 @@ f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_packed_normals = False +f3d_mat.rdp_settings.g_lighttoalpha = False +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_fresnel = False f3d_mat.rdp_settings.g_fog = True f3d_mat.rdp_settings.g_lighting = True f3d_mat.rdp_settings.g_tex_gen = False f3d_mat.rdp_settings.g_tex_gen_linear = False +f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' @@ -2295,6 +2485,9 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None +f3d_mat.ao_ambient = 1.0 +f3d_mat.ao_directional = 0.625 +f3d_mat.set_ao = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = True @@ -2304,10 +2497,17 @@ f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_packed_normals = False +f3d_mat.rdp_settings.g_lighttoalpha = False +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_fresnel = False f3d_mat.rdp_settings.g_fog = True f3d_mat.rdp_settings.g_lighting = True f3d_mat.rdp_settings.g_tex_gen = False f3d_mat.rdp_settings.g_tex_gen_linear = False +f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' @@ -2412,6 +2612,9 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None +f3d_mat.ao_ambient = 1.0 +f3d_mat.ao_directional = 0.625 +f3d_mat.set_ao = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False @@ -2421,10 +2624,17 @@ f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = True +f3d_mat.rdp_settings.g_attroffset_st_enable = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_packed_normals = False +f3d_mat.rdp_settings.g_lighttoalpha = False +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_fresnel = False f3d_mat.rdp_settings.g_fog = False f3d_mat.rdp_settings.g_lighting = True f3d_mat.rdp_settings.g_tex_gen = False f3d_mat.rdp_settings.g_tex_gen_linear = False +f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' @@ -2529,6 +2739,9 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None +f3d_mat.ao_ambient = 1.0 +f3d_mat.ao_directional = 0.625 +f3d_mat.set_ao = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False @@ -2538,10 +2751,17 @@ f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = True +f3d_mat.rdp_settings.g_attroffset_st_enable = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_packed_normals = False +f3d_mat.rdp_settings.g_lighttoalpha = False +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_fresnel = False f3d_mat.rdp_settings.g_fog = False f3d_mat.rdp_settings.g_lighting = True f3d_mat.rdp_settings.g_tex_gen = False f3d_mat.rdp_settings.g_tex_gen_linear = False +f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' @@ -2646,6 +2866,9 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None +f3d_mat.ao_ambient = 1.0 +f3d_mat.ao_directional = 0.625 +f3d_mat.set_ao = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False @@ -2655,10 +2878,17 @@ f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = True +f3d_mat.rdp_settings.g_attroffset_st_enable = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_packed_normals = False +f3d_mat.rdp_settings.g_lighttoalpha = False +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_fresnel = False f3d_mat.rdp_settings.g_fog = False f3d_mat.rdp_settings.g_lighting = True f3d_mat.rdp_settings.g_tex_gen = False f3d_mat.rdp_settings.g_tex_gen_linear = False +f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' @@ -2763,6 +2993,9 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None +f3d_mat.ao_ambient = 1.0 +f3d_mat.ao_directional = 0.625 +f3d_mat.set_ao = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False @@ -2772,10 +3005,17 @@ f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_packed_normals = False +f3d_mat.rdp_settings.g_lighttoalpha = False +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_fresnel = False f3d_mat.rdp_settings.g_fog = False f3d_mat.rdp_settings.g_lighting = True f3d_mat.rdp_settings.g_tex_gen = False f3d_mat.rdp_settings.g_tex_gen_linear = False +f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' @@ -2880,6 +3120,9 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None +f3d_mat.ao_ambient = 1.0 +f3d_mat.ao_directional = 0.625 +f3d_mat.set_ao = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False @@ -2889,10 +3132,17 @@ f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_packed_normals = False +f3d_mat.rdp_settings.g_lighttoalpha = False +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_fresnel = False f3d_mat.rdp_settings.g_fog = False f3d_mat.rdp_settings.g_lighting = True f3d_mat.rdp_settings.g_tex_gen = False f3d_mat.rdp_settings.g_tex_gen_linear = False +f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' @@ -2997,6 +3247,9 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None +f3d_mat.ao_ambient = 1.0 +f3d_mat.ao_directional = 0.625 +f3d_mat.set_ao = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False @@ -3006,10 +3259,17 @@ f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = True +f3d_mat.rdp_settings.g_attroffset_st_enable = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_packed_normals = False +f3d_mat.rdp_settings.g_lighttoalpha = False +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_fresnel = False f3d_mat.rdp_settings.g_fog = False f3d_mat.rdp_settings.g_lighting = True f3d_mat.rdp_settings.g_tex_gen = False f3d_mat.rdp_settings.g_tex_gen_linear = False +f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' @@ -3114,6 +3374,9 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None +f3d_mat.ao_ambient = 1.0 +f3d_mat.ao_directional = 0.625 +f3d_mat.set_ao = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False @@ -3123,10 +3386,17 @@ f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_packed_normals = False +f3d_mat.rdp_settings.g_lighttoalpha = False +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_fresnel = False f3d_mat.rdp_settings.g_fog = False f3d_mat.rdp_settings.g_lighting = True f3d_mat.rdp_settings.g_tex_gen = False f3d_mat.rdp_settings.g_tex_gen_linear = False +f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' @@ -3231,6 +3501,9 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None +f3d_mat.ao_ambient = 1.0 +f3d_mat.ao_directional = 0.625 +f3d_mat.set_ao = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False @@ -3240,10 +3513,17 @@ f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = True +f3d_mat.rdp_settings.g_attroffset_st_enable = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_packed_normals = False +f3d_mat.rdp_settings.g_lighttoalpha = False +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_fresnel = False f3d_mat.rdp_settings.g_fog = False f3d_mat.rdp_settings.g_lighting = False f3d_mat.rdp_settings.g_tex_gen = False f3d_mat.rdp_settings.g_tex_gen_linear = False +f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' @@ -3348,6 +3628,9 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None +f3d_mat.ao_ambient = 1.0 +f3d_mat.ao_directional = 0.625 +f3d_mat.set_ao = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False @@ -3357,10 +3640,17 @@ f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = True +f3d_mat.rdp_settings.g_attroffset_st_enable = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_packed_normals = False +f3d_mat.rdp_settings.g_lighttoalpha = False +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_fresnel = False f3d_mat.rdp_settings.g_fog = False f3d_mat.rdp_settings.g_lighting = False f3d_mat.rdp_settings.g_tex_gen = False f3d_mat.rdp_settings.g_tex_gen_linear = False +f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' @@ -3466,6 +3756,9 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None +f3d_mat.ao_ambient = 1.0 +f3d_mat.ao_directional = 0.625 +f3d_mat.set_ao = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False @@ -3475,10 +3768,17 @@ f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_packed_normals = False +f3d_mat.rdp_settings.g_lighttoalpha = False +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_fresnel = False f3d_mat.rdp_settings.g_fog = False f3d_mat.rdp_settings.g_lighting = True f3d_mat.rdp_settings.g_tex_gen = False f3d_mat.rdp_settings.g_tex_gen_linear = False +f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' @@ -3585,6 +3885,9 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None +f3d_mat.ao_ambient = 1.0 +f3d_mat.ao_directional = 0.625 +f3d_mat.set_ao = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False @@ -3594,10 +3897,17 @@ f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_packed_normals = False +f3d_mat.rdp_settings.g_lighttoalpha = False +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_fresnel = False f3d_mat.rdp_settings.g_fog = False f3d_mat.rdp_settings.g_lighting = True f3d_mat.rdp_settings.g_tex_gen = False f3d_mat.rdp_settings.g_tex_gen_linear = False +f3d_mat.rdp_settings.g_lod = False f3d_mat.rdp_settings.g_shade_smooth = True f3d_mat.rdp_settings.g_clipping = False f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' diff --git a/fast64_internal/f3d/f3d_parser.py b/fast64_internal/f3d/f3d_parser.py index 8212a6a..37add2c 100644 --- a/fast64_internal/f3d/f3d_parser.py +++ b/fast64_internal/f3d/f3d_parser.py @@ -508,7 +508,7 @@ class F3DContext: self.verts: list[F3DVert] = [] self.limbGroups: dict[str : list[int]] = {} # dict of groupName : vertex indices - self.lights: Lights = Lights("lights_context") + self.lights: Lights = Lights("lights_context", self.f3d) # Here these are ints, but when parsing the values will be normalized. self.lights.l = [ @@ -576,7 +576,7 @@ class F3DContext: self.tileSizes = [DPSetTileSize(i, 0, 0, 32, 32) for i in range(8)] - self.lights = Lights("lights_context") + self.lights = Lights("lights_context", self.f3d) self.lights.l = [ Light([0, 0, 0], [0x28, 0x28, 0x28]), Light([0, 0, 0], [0x28, 0x28, 0x28]), @@ -600,14 +600,14 @@ class F3DContext: # decomp format "\{\s*\{\s*" + "\{([^,\}]*),([^,\}]*),([^,\}]*)\}\s*," - + "[^,\}]*,\s*" + + "([^,\}]*),\s*" + "\{([^,\}]*),([^,\}]*)\}\s*,\s*" + "\{([^,\}]*),([^,\}]*),([^,\}]*),([^,\}]*)\}\s*" + "\}\s*\}", # nusys format "\{\s*" + "([^,\}]*),([^,\}]*),([^,\}]*)," - + "[^,\}]*," + + "([^,\}]*)," + "([^,\}]*),([^,\}]*)," + "([^,\}]*),([^,\}]*),([^,\}]*),([^,\}]*)\s*" + "\}", @@ -656,18 +656,19 @@ class F3DContext: uv = [convertF3DUV(f3dVert.uv[i], texDimensions[i]) for i in range(2)] uv[1] = 1 - uv[1] - color = [ - value / 256 - if value > 0 - else int.from_bytes(round(value).to_bytes(1, "big", signed=True), "big", signed=False) / 256 - for value in f3dVert.getColorOrNormal() - ] - - normal = bytesToNormal(f3dVert.getColorOrNormal()[:3]) + [0] - normal = (transform.inverted().transposed() @ mathutils.Vector(normal)).normalized()[:3] + has_rgb, has_normal, has_packed_normals = getRgbNormalSettings(self.mat()) + rgb = mathutils.Vector([v / 0xFF for v in f3dVert.rgb]) if has_rgb else None + alpha = f3dVert.alpha / 0xFF + normal = None + if has_normal: + if has_packed_normals: + normal = f3dVert.normal + else: + normal = mathutils.Vector([v - 0x100 if v >= 0x80 else v for v in f3dVert.rgb]).normalized() + normal = (transform.inverse().transposed() @ normal).normalized() # NOTE: The groupIndex here does NOT correspond to a vertex group, but to the name of the limb (c variable) - return BufferVertex(F3DVert(position, uv, color, normal), bufferVert.groupIndex, bufferVert.materialIndex) + return BufferVertex(F3DVert(position, uv, rgb, normal, alpha), bufferVert.groupIndex, bufferVert.materialIndex) def addVertices(self, num, start, vertexDataName, vertexDataOffset): vertexData = self.vertexData[vertexDataName] @@ -879,6 +880,18 @@ class F3DContext: mat.rdp_settings.g_cull_front = value if bitFlags & self.f3d.G_CULL_BACK: mat.rdp_settings.g_cull_back = value + if bitFlags & self.f3d.G_ATTROFFSET_ST_ENABLE: + mat.rdp_settings.g_attroffset_st_enable = value + if bitFlags & self.f3d.G_ATTROFFSET_Z_ENABLE: + mat.rdp_settings.g_attroffset_z_enable = value + if bitFlags & self.f3d.G_PACKED_NORMALS: + mat.rdp_settings.g_packed_normals = value + if bitFlags & self.f3d.G_LIGHTTOALPHA: + mat.rdp_settings.g_lighttoalpha = value + if bitFlags & self.f3d.G_AMBOCCLUSION: + mat.rdp_settings.g_ambocclusion = value + if bitFlags & self.f3d.G_FRESNEL: + mat.rdp_settings.g_fresnel = value if bitFlags & self.f3d.G_FOG: mat.rdp_settings.g_fog = value if bitFlags & self.f3d.G_LIGHTING: @@ -887,6 +900,8 @@ class F3DContext: mat.rdp_settings.g_tex_gen = value if bitFlags & self.f3d.G_TEXTURE_GEN_LINEAR: mat.rdp_settings.g_tex_gen_linear = value + if bitFlags & self.f3d.G_LOD: + mat.rdp_settings.g_lod = value if bitFlags & self.f3d.G_SHADING_SMOOTH: mat.rdp_settings.g_shade_smooth = value if bitFlags & self.f3d.G_CLIPPING: @@ -901,10 +916,17 @@ class F3DContext: mat.rdp_settings.g_shade = bitFlags & self.f3d.G_SHADE != 0 mat.rdp_settings.g_cull_front = bitFlags & self.f3d.G_CULL_FRONT != 0 mat.rdp_settings.g_cull_back = bitFlags & self.f3d.G_CULL_BACK != 0 + mat.rdp_settings.g_attroffset_st_enable = bitFlags & self.f3d.G_ATTROFFSET_ST_ENABLE != 0 + mat.rdp_settings.g_attroffset_z_enable = bitFlags & self.f3d.G_ATTROFFSET_Z_ENABLE != 0 + mat.rdp_settings.g_packed_normals = bitFlags & self.f3d.G_PACKED_NORMALS != 0 + mat.rdp_settings.g_lighttoalpha = bitFlags & self.f3d.G_LIGHTTOALPHA != 0 + mat.rdp_settings.g_ambocclusion = bitFlags & self.f3d.G_AMBOCCLUSION != 0 + mat.rdp_settings.g_fresnel = bitFlags & self.f3d.G_FRESNEL != 0 mat.rdp_settings.g_fog = bitFlags & self.f3d.G_FOG != 0 mat.rdp_settings.g_lighting = bitFlags & self.f3d.G_LIGHTING != 0 mat.rdp_settings.g_tex_gen = bitFlags & self.f3d.G_TEXTURE_GEN != 0 mat.rdp_settings.g_tex_gen_linear = bitFlags & self.f3d.G_TEXTURE_GEN_LINEAR != 0 + mat.rdp_settings.g_lod = bitFlags & self.f3d.G_LOD != 0 mat.rdp_settings.g_shade_smooth = bitFlags & self.f3d.G_SHADING_SMOOTH != 0 mat.rdp_settings.g_clipping = bitFlags & self.f3d.G_CLIPPING != 0 @@ -1245,7 +1267,7 @@ class F3DContext: # normally a and l are Ambient and Light objects, # but here they will be a color and blender light object array. - lights = Lights(lightsName) + lights = Lights(lightsName, self.f3d) lights.a = Ambient(ambientColor) lights.l = lightList @@ -1547,6 +1569,27 @@ class F3DContext: self.setLightColor(dlData, command) elif command.name[:13] == "gsSPSetLights": self.setLights(dlData, command) + elif command.name == "gsSPAmbOcclusion": + mat.ao_ambient = float(int(command.params[0])) / (2**16) + mat.ao_directional = float(int(command.params[1])) / (2**16) + mat.set_ao = True + elif command.name == "gsSPFresnel": + offset = min(float(int(command.params[0])) / (2**15), 1.0) + scale = int(command.params[1]) + scaleInt = -(0x10000 - scale) if scale >= 0x8000 else scale + scale = float(scaleInt) / (2**8) + mat.fresnel_lo = offset + mat.fresnel_hi = (1.0 / scale) + offset + mat.set_fresnel = True + elif command.name == "gsSPAttrOffsetST": + mat.attroffs_st = [ + from_s16_str(command.params[0]) / 32, + from_s16_str(command.params[1]) / 32 + ] + mat.set_attroffs_st = True + elif command.name == "gsSPAttrOffsetZ": + mat.attroffs_z = from_s16_str(command.params[0]) + mat.set_attroffs_z = True elif command.name == "gsSPFogFactor": pass elif command.name == "gsSPFogPosition": diff --git a/fast64_internal/f3d/f3d_writer.py b/fast64_internal/f3d/f3d_writer.py index d0d9529..0bd4bd8 100644 --- a/fast64_internal/f3d/f3d_writer.py +++ b/fast64_internal/f3d/f3d_writer.py @@ -1466,7 +1466,7 @@ def saveLightsDefinition(fModel, fMaterial, material, lightsName): if lights is not None: return lights - lights = Lights(toAlnum(lightsName)) + lights = Lights(toAlnum(lightsName), fModel.f3d) if material.use_default_lighting: lights.a = Ambient(exportColor(material.ambient_light_color)) From 98aa7067bcb019a586e6566972070eb0235dc706 Mon Sep 17 00:00:00 2001 From: Sauraen Date: Mon, 9 Oct 2023 21:22:57 -0700 Subject: [PATCH 16/74] Finished import of old changes --- fast64_internal/f3d/f3d_material.py | 15 - fast64_internal/f3d/f3d_parser.py | 14 +- fast64_internal/f3d/f3d_writer.py | 433 +++++++----------- fast64_internal/sm64/sm64_geolayout_writer.py | 18 +- fast64_internal/utility.py | 68 ++- 5 files changed, 222 insertions(+), 326 deletions(-) diff --git a/fast64_internal/f3d/f3d_material.py b/fast64_internal/f3d/f3d_material.py index 79dd53a..2b621fb 100644 --- a/fast64_internal/f3d/f3d_material.py +++ b/fast64_internal/f3d/f3d_material.py @@ -254,24 +254,9 @@ def getTmemMax(texFormat): # Necessary for UV half pixel offset (see 13.7.5.3) def isTexturePointSampled(material): f3dMat = material.f3d_mat - return f3dMat.rdp_settings.g_mdsft_text_filt == "G_TF_POINT" -def isLightingDisabled(material): - f3dMat = material.f3d_mat - return not f3dMat.rdp_settings.g_lighting - - -# Necessary as G_SHADE_SMOOTH actually does nothing -def checkIfFlatShaded(material): - if material.mat_ver > 3: - f3dMat = material.f3d_mat - else: - f3dMat = material - return not f3dMat.rdp_settings.g_shade_smooth - - def F3DOrganizeLights(self, context): # Flag to prevent infinite recursion on update callback with F3DMaterial_UpdateLock(get_material_from_context(context)) as material: diff --git a/fast64_internal/f3d/f3d_parser.py b/fast64_internal/f3d/f3d_parser.py index 37add2c..22357cd 100644 --- a/fast64_internal/f3d/f3d_parser.py +++ b/fast64_internal/f3d/f3d_parser.py @@ -1576,7 +1576,7 @@ class F3DContext: elif command.name == "gsSPFresnel": offset = min(float(int(command.params[0])) / (2**15), 1.0) scale = int(command.params[1]) - scaleInt = -(0x10000 - scale) if scale >= 0x8000 else scale + scaleInt = scale - 0x10000 if scale >= 0x8000 else scale scale = float(scaleInt) / (2**8) mat.fresnel_lo = offset mat.fresnel_hi = (1.0 / scale) + offset @@ -1946,26 +1946,22 @@ def parseVertexData(dlData: str, vertexDataName: str, f3dContext: F3DContext): patterns = f3dContext.vertexFormatPatterns(data) vertexData = [] for pattern in patterns: - # Note that color is None here, as we are just parsing vertex data. - # The same values should be used for color and normal, but getColorOrNormal() will be used later - # which returns whichever value is not None between the two. - - # When loaded into the vertex buffer and transformed, the actual normal/color will be calculated. + # For this step, store rgb/normal as rgb and packed normal as normal. vertexData = [ F3DVert( mathutils.Vector( [math_eval(match.group(1), f3d), math_eval(match.group(2), f3d), math_eval(match.group(3), f3d)] ), - mathutils.Vector([math_eval(match.group(4), f3d), math_eval(match.group(5), f3d)]), - None, + mathutils.Vector([math_eval(match.group(5), f3d), math_eval(match.group(6), f3d)]), mathutils.Vector( [ - math_eval(match.group(6), f3d), math_eval(match.group(7), f3d), math_eval(match.group(8), f3d), math_eval(match.group(9), f3d), ] ), + unpackNormal(match.group(4)), + math_eval(match.group(10), f3d), ) for match in re.finditer(pattern, data, re.DOTALL) ] diff --git a/fast64_internal/f3d/f3d_writer.py b/fast64_internal/f3d/f3d_writer.py index 0bd4bd8..8d75e40 100644 --- a/fast64_internal/f3d/f3d_writer.py +++ b/fast64_internal/f3d/f3d_writer.py @@ -1,6 +1,8 @@ -from typing import Union +from typing import Union, Optional +from dataclasses import dataclass import functools import bpy, mathutils, os, re, copy, math +from mathutils import Vector from math import ceil from bpy.utils import register_class, unregister_class @@ -10,8 +12,6 @@ from .f3d_material import ( all_combiner_uses, getMaterialScrollDimensions, isTexturePointSampled, - isLightingDisabled, - checkIfFlatShaded, ) from .f3d_texture_writer import MultitexManager, TileLoad, maybeSaveSingleLargeTextureSetup from .f3d_gbi import * @@ -118,7 +118,7 @@ def getInfoDict(obj): for loopIndex in face.loops: convertInfo = LoopConvertInfo( - uv_data, obj, isLightingDisabled(obj.material_slots[face.material_index].material) + uv_data, obj, obj.material_slots[face.material_index].material ) f3dVertDict[loopIndex] = getF3DVert(mesh.loops[loopIndex], face, convertInfo, mesh) for face in mesh.loop_triangles: @@ -409,18 +409,19 @@ def addCullCommand(obj, fMesh, transformMatrix, matWriteMethod): fMesh.add_cull_vtx() # if the object has a specifically set culling bounds, use that instead for vertexPos in obj.get("culling_bounds", obj.bound_box): - # Most other fields of convertVertexData are unnecessary for bounding box verts fMesh.cullVertexList.vertices.append( - convertVertexData( - obj.data, - mathutils.Vector(vertexPos), + F3DVert( + Vector(vertexPos), [0, 0], None, - mathutils.Vector([0, 0, 0, 0]), + Vector([0, 0, 0]), + None, + 0.0, + ).toVtx( + obj.data, [32, 32], transformMatrix, - False, - False, + True, ) ) @@ -646,28 +647,11 @@ def saveMeshByFaces( return currentGroupIndex -def get8bitRoundedNormal(loop: bpy.types.MeshLoop, mesh): - alpha_layer = getColorLayer(mesh, "Alpha") - - if alpha_layer is not None: - normalizedAColor = alpha_layer[loop.index].color - if is3_2_or_above(): - normalizedAColor = gammaCorrect(normalizedAColor) - normalizedA = colorToLuminance(normalizedAColor[0:3]) - else: - normalizedA = 1 - - # Don't round, as this may move UV toward UV bounds. - return mathutils.Vector( - (int(loop.normal[0] * 128) / 128, int(loop.normal[1] * 128) / 128, int(loop.normal[2] * 128) / 128, normalizedA) - ) - - +@dataclass class LoopConvertInfo: - def __init__(self, uv_data: bpy.types.bpy_prop_collection | list[bpy.types.MeshUVLoop], obj, exportVertexColors): - self.uv_data: bpy.types.bpy_prop_collection | list[bpy.types.MeshUVLoop] = uv_data - self.obj = obj - self.exportVertexColors = exportVertexColors + uv_data: bpy.types.bpy_prop_collection | list[bpy.types.MeshUVLoop] + obj: bpy.types.Object + material: bpy.types.Material def getNewIndices(existingIndices, bufferStart): @@ -682,21 +666,21 @@ def getNewIndices(existingIndices, bufferStart): return newIndices -# Color and normal are separate, since for parsing, the normal must be transformed into -# bone/object space while the color should just be a regular conversion. class F3DVert: def __init__( self, - position: mathutils.Vector, - uv: mathutils.Vector, - color: mathutils.Vector | None, # 4 components - normal: mathutils.Vector | None, # 4 components + position: Vector, + uv: Vector, + rgb: Optional[Vector], + normal: Optional[Vector], + alpha: float, ): - self.position: mathutils.Vector = position - self.uv: mathutils.Vector = uv - self.stOffset: tuple(int, int) | None = None - self.color: mathutils.Vector | None = color - self.normal: mathutils.Vector | None = normal + self.position: Vector = position + self.uv: Vector = uv + self.stOffset: Optional[tuple(int, int)] = None + self.rgb: Optional[Vector] = rgb + self.normal: Optional[Vector] = normal + self.alpha: float = alpha def __eq__(self, other): if not isinstance(other, F3DVert): @@ -705,17 +689,50 @@ class F3DVert: self.position == other.position and self.uv == other.uv and self.stOffset == other.stOffset - and self.color == other.color + and self.rgb == other.rgb and self.normal == other.normal + and self.alpha == other.alpha ) + + def toVtx(self, mesh, texDimensions, transformMatrix, isPointSampled: bool, tex_scale=(1, 1)) -> Vtx: + # Position (8 bytes) + position = [int(round(floatValue)) for floatValue in (transformMatrix @ self.position)] - def getColorOrNormal(self): - if self.color is None and self.normal is None: - raise PluginError("An F3D vert has neither a color or a normal.") - elif self.color is not None: - return self.color + # UV (4 bytes) + # For F3D, Bilinear samples the point from the center of the pixel. + # However, Point samples from the corner. + # Thus we add 0.5 to the UV only if bilinear filtering. + # see section 13.7.5.3 in programming manual. + pixelOffset = ( + (0, 0) + if (isPointSampled or tex_scale[0] == 0 or tex_scale[1] == 0) + else (0.5 / tex_scale[0], 0.5 / tex_scale[1]) + ) + pixelOffset = self.stOffset if self.stOffset is not None else pixelOffset + + uv = [ + convertFloatToFixed16(self.uv[0] * texDimensions[0] - pixelOffset[0]), + convertFloatToFixed16(self.uv[1] * texDimensions[1] - pixelOffset[1]), + ] + + packedNormal = 0 + if self.normal is not None: + # normal transformed correctly. + normal = (transformMatrix.inverted().transposed() @ self.normal).normalized() + if self.rgb is not None: + packedNormal = packNormal(normal) + + if self.rgb is not None: + colorOrNormal = [scaleToU8(c).to_bytes(1, "big")[0] for c in self.rgb] else: - return self.normal + colorOrNormal = [ + int(round(normal[0] * 127)).to_bytes(1, "big", signed=True)[0], + int(round(normal[1] * 127)).to_bytes(1, "big", signed=True)[0], + int(round(normal[2] * 127)).to_bytes(1, "big", signed=True)[0], + ] + colorOrNormal.append(scaleToU8(self.alpha).to_bytes(1, "big")[0]) + + return Vtx(position, uv, colorOrNormal, packedNormal) # groupIndex is either a vertex group (writing), or name of c variable identifying a transform group, like a limb (parsing) @@ -797,12 +814,10 @@ class TriangleConverter: self.triList = triList self.vtxList = vtxList - exportVertexColors = isLightingDisabled(material) uv_data = triConverterInfo.obj.data.uv_layers["UVMap"].data - self.convertInfo = LoopConvertInfo(uv_data, triConverterInfo.obj, exportVertexColors) + self.convertInfo = LoopConvertInfo(uv_data, triConverterInfo.obj, material) self.texDimensions = texDimensions self.isPointSampled = isTexturePointSampled(material) - self.exportVertexColors = exportVertexColors self.tex_scale = material.f3d_mat.tex_scale def vertInBuffer(self, bufferVert, material_index): @@ -843,16 +858,11 @@ class TriangleConverter: # Save vertices for bufferVert in self.vertBuffer[bufferStart:bufferEnd]: self.vtxList.vertices.append( - convertVertexData( + bufferVert.f3dVert.toVtx( self.triConverterInfo.mesh, - bufferVert.f3dVert.position, - bufferVert.f3dVert.uv, - bufferVert.f3dVert.stOffset, - bufferVert.f3dVert.getColorOrNormal(), self.texDimensions, self.triConverterInfo.getTransformMatrix(bufferVert.groupIndex), self.isPointSampled, - self.exportVertexColors, tex_scale=self.tex_scale, ) ) @@ -878,16 +888,11 @@ class TriangleConverter: # Save vertices for bufferVert in self.vertBuffer[bufferStart:bufferEnd]: self.vtxList.vertices.append( - convertVertexData( + bufferVert.f3dVert.toVtx( self.triConverterInfo.mesh, - bufferVert.f3dVert.position, - bufferVert.f3dVert.uv, - bufferVert.f3dVert.stOffset, - bufferVert.f3dVert.getColorOrNormal(), self.texDimensions, self.triConverterInfo.getTransformMatrix(bufferVert.groupIndex), self.isPointSampled, - self.exportVertexColors, tex_scale=self.tex_scale, ) ) @@ -943,179 +948,35 @@ class TriangleConverter: def getF3DVert(loop: bpy.types.MeshLoop, face, convertInfo: LoopConvertInfo, mesh: bpy.types.Mesh): - position: mathutils.Vector = mesh.vertices[loop.vertex_index].co.copy().freeze() + position: Vector = mesh.vertices[loop.vertex_index].co.copy().freeze() # N64 is -Y, Blender is +Y - uv: mathutils.Vector = convertInfo.uv_data[loop.index].uv.copy() + uv: Vector = convertInfo.uv_data[loop.index].uv.copy() uv[:] = [field if not math.isnan(field) else 0 for field in uv] uv[1] = 1 - uv[1] uv = uv.freeze() - color, normal = getLoopColorOrNormal( - loop, face, convertInfo.obj.data, convertInfo.obj, convertInfo.exportVertexColors - ) + + has_rgb, has_normal, _ = getRgbNormalSettings(convertInfo.material) + mesh = convertInfo.obj.data + color = getLoopColor(loop, mesh) + rgb = color[:3] if has_rgb else None + normal = getLoopNormal(loop) if has_normal else None + alpha = color[3] - return F3DVert(position, uv, color, normal) + return F3DVert(position, uv, rgb, normal, alpha) -def getLoopNormal(loop: bpy.types.MeshLoop, face, mesh, isFlatShaded): - # This is a workaround for flat shading not working well. - # Since we support custom blender normals we can now ignore this. - # if isFlatShaded: - # normal = -face.normal #??? - # else: - # normal = -loop.normal #??? - # return get8bitRoundedNormal(normal).freeze() - return get8bitRoundedNormal(loop, mesh).freeze() - - -""" -def getLoopNormalCreased(bLoop, obj): - edges = obj.data.edges - centerVert = bLoop.vert - - availableFaces = [] - visitedFaces = [bLoop.face] - connectedFaces = getConnectedFaces(bLoop.face, bLoop.vert) - if len(connectedFaces) == 0: - return bLoop.calc_normal() - - for face in connectedFaces: - availableFaces.append(FaceWeight(face, bLoop.face, 1)) - - curNormal = bLoop.calc_normal() * bLoop.calc_angle() - while len(availableFaces) > 0: - nextFaceWeight = getHighestFaceWeight(availableFaces) - curNormal += getWeightedNormalAndMoveToNextFace( - nextFaceWeight, visitedFaces, availableFaces, centerVert, edges) - - return curNormal.normalized() - -def getConnectedFaces(bFace, bVert): - connectedFaces = [] - for face in bVert.link_faces: - if face == bFace: - continue - for edge in face.edges: - if bFace in edge.link_faces: - connectedFaces.append(face) - return connectedFaces - -# returns false if not enough faces to check for creasing -def getNextFace(faceWeight, bVert, visitedFaces, availableFaces): - connectedFaces = getConnectedFaces(faceWeight.face, bVert) - visitedFaces.append(faceWeight.face) - - newFaceFound = False - nextPrevFace = faceWeight.face - for face in connectedFaces: - if face in visitedFaces: - continue - elif not newFaceFound: - newFaceFound = True - faceWeight.prevFace = faceWeight.face - faceWeight.face = face - else: - availableFaces.append(FaceWeight(face, nextPrevFace, - faceWeight.weight)) - - if not newFaceFound: - availableFaces.remove(faceWeight) - - removedFaceWeights = [] - for otherFaceWeight in availableFaces: - if otherFaceWeight.face in visitedFaces: - removedFaceWeights.append(otherFaceWeight) - for removedFaceWeight in removedFaceWeights: - availableFaces.remove(removedFaceWeight) - -def getLoopFromFaceVert(bFace, bVert): - for loop in bFace.loops: - if loop.vert == bVert: - return loop - return None - -def getEdgeBetweenFaces(faceWeight): - face1 = faceWeight.face - face2 = faceWeight.prevFace - for edge1 in face1.edges: - for edge2 in face2.edges: - if edge1 == edge2: - return edge1 - return None - -class FaceWeight: - def __init__(self, face, prevFace, weight): - self.face = face - self.prevFace = prevFace - self.weight = weight - -def getWeightedNormalAndMoveToNextFace(selectFaceWeight, visitedFaces, - availableFaces, centerVert, edges): - selectLoop = getLoopFromFaceVert(selectFaceWeight.face, centerVert) - edgeIndex = getEdgeBetweenFaces(selectFaceWeight).index - - # Ignore triangulated faces - if edgeIndex < len(edges): - selectFaceWeight.weight *= 1 - edges[edgeIndex].crease - - getNextFace(selectFaceWeight, centerVert, visitedFaces, availableFaces) - return selectLoop.calc_normal() * selectLoop.calc_angle() * \ - selectFaceWeight.weight - -def getHighestFaceWeight(faceWeights): - highestFaceWeight = faceWeights[0] - for faceWeight in faceWeights[1:]: - if faceWeight.weight > highestFaceWeight.weight: - highestFaceWeight = faceWeight - return highestFaceWeight -""" - - -def convertVertexData( - mesh, - loopPos, - loopUV, - stOffset, - loopColorOrNormal, - texDimensions, - transformMatrix, - isPointSampled, - exportVertexColors, - tex_scale=(1, 1), -): - # Position (8 bytes) - position = [int(round(floatValue)) for floatValue in (transformMatrix @ loopPos)] - - # UV (4 bytes) - # For F3D, Bilinear samples the point from the center of the pixel. - # However, Point samples from the corner. - # Thus we add 0.5 to the UV only if bilinear filtering. - # see section 13.7.5.3 in programming manual. - pixelOffset = ( - (0, 0) - if (isPointSampled or tex_scale[0] == 0 or tex_scale[1] == 0) - else (0.5 / tex_scale[0], 0.5 / tex_scale[1]) - ) - pixelOffset = stOffset if stOffset is not None else pixelOffset - - uv = [ - convertFloatToFixed16(loopUV[0] * texDimensions[0] - pixelOffset[0]), - convertFloatToFixed16(loopUV[1] * texDimensions[1] - pixelOffset[1]), - ] - - # Color/Normal (4 bytes) - if exportVertexColors: - colorOrNormal = [scaleToU8(c).to_bytes(1, "big")[0] for c in loopColorOrNormal] - else: - # normal transformed correctly. - normal = (transformMatrix.inverted().transposed() @ loopColorOrNormal).normalized() - colorOrNormal = [ - int(round(normal[0] * 127)).to_bytes(1, "big", signed=True)[0], - int(round(normal[1] * 127)).to_bytes(1, "big", signed=True)[0], - int(round(normal[2] * 127)).to_bytes(1, "big", signed=True)[0], - scaleToU8(loopColorOrNormal[3]).to_bytes(1, "big")[0], - ] - - return Vtx(position, uv, colorOrNormal) +def getLoopNormal(loop: bpy.types.MeshLoop): + # Have to quantize to something because F3DVerts will be compared, and we + # don't want floating-point inaccuracy causing "same" vertices not to be + # merged. But, it hasn't been transformed yet, so quantizing to s8 here will + # lose some accuracy. + return Vector( + ( + round(loop.normal[0] * 2**16) / 2**16, + round(loop.normal[1] * 2**16) / 2**16, + round(loop.normal[2] * 2**16) / 2**16 + ) + ).freeze() @functools.lru_cache(0) @@ -1123,8 +984,7 @@ def is3_2_or_above(): return bpy.app.version[0] >= 3 and bpy.app.version[1] >= 2 -def getLoopColor(loop: bpy.types.MeshLoop, mesh, mat_ver): - +def getLoopColor(loop: bpy.types.MeshLoop, mesh): color_layer = getColorLayer(mesh, layer="Col") alpha_layer = getColorLayer(mesh, layer="Alpha") @@ -1146,17 +1006,6 @@ def getLoopColor(loop: bpy.types.MeshLoop, mesh, mat_ver): return mathutils.Vector((normalizedRGB[0], normalizedRGB[1], normalizedRGB[2], normalizedA)) -def getLoopColorOrNormal( - loop: bpy.types.MeshLoop, face, mesh: bpy.types.Mesh, obj: bpy.types.Object, exportVertexColors: bool -) -> tuple[mathutils.Vector, None] | tuple[None, mathutils.Vector]: - material = obj.material_slots[face.material_index].material - isFlatShaded = checkIfFlatShaded(material) - if exportVertexColors: - return getLoopColor(loop, mesh, material.mat_ver), None - else: - return None, getLoopNormal(loop, face, mesh, isFlatShaded) - - def createTriangleCommands(triangles, vertexBuffer, useSP2Triangle): triangles = copy.deepcopy(triangles) commands = [] @@ -1320,6 +1169,28 @@ def saveOrGetF3DMaterial(material, fModel, obj, drawLayer, convertTextureData): f3dMat.combiner1.D_alpha, ) ) + + if f3dMat.set_ao: + fMaterial.mat_only_DL.commands.append( + SPAmbOcclusion( + hex(round(f3dMat.ao_ambient * 2**16)), + hex(round(f3dMat.ao_directional * 2**16)) + ) + ) + + if f3dMat.set_fresnel: + TODO() + + if f3dMat.set_attroffs_st: + fMaterial.mat_only_DL.commands.append( + SPAttrOffsetST( + hex(to_s16(f3dMat.attroffs_st[0] * 32)), + hex(to_s16(f3dMat.attroffs_st[1] * 32)), + ) + ) + + if f3dMat.set_attroffs_z: + fMaterial.mat_only_DL.commands.append(SPAttrOffsetZ(f3dMat.attroffs_z)) if f3dMat.set_fog: if f3dMat.use_global_fog and fModel.global_data.getCurrentAreaData() is not None: @@ -1513,21 +1384,45 @@ def saveBitGeoF3DEX2(value, defaultValue, flagName, geo, matWriteMethod): geo.clearFlagList.append(flagName) +def saveBitGeo(value, defaultValue, flagName, setGeo, clearGeo, matWriteMethod): + if value != defaultValue or matWriteMethod == GfxMatWriteMethod.WriteAll: + if value: + setGeo.flagList.append(flagName) + else: + clearGeo.flagList.append(flagName) + + +def saveGeoModeCommon(saveFunc, settings, defaults, args): + saveFunc(settings.g_zbuffer, defaults.g_zbuffer, "G_ZBUFFER", *args) + saveFunc(settings.g_shade, defaults.g_shade, "G_SHADE", *args) + saveFunc(settings.g_cull_front, defaults.g_cull_front, "G_CULL_FRONT", *args) + saveFunc(settings.g_cull_back, defaults.g_cull_back, "G_CULL_BACK", *args) + if bpy.context.scene.isCustomUcode: + cu = bpy.context.scene.customUcode + if cu.has_attr_offsets: + saveFunc(settings.g_attroffset_st_enable, defaults.g_attroffset_st_enable, "G_ATTROFFSET_ST_ENABLE", *args) + saveFunc(settings.g_attroffset_z_enable, defaults.g_attroffset_z_enable, "G_ATTROFFSET_Z_ENABLE", *args) + if cu.has_packed_normals: + saveFunc(settings.g_packed_normals, defaults.g_packed_normals, "G_PACKED_NORMALS", *args) + if cu.has_light_to_alpha: + saveFunc(settings.g_lighttoalpha, defaults.g_lighttoalpha, "G_LIGHTTOALPHA", *args) + if cu.has_ambient_occlusion: + saveFunc(settings.g_ambocclusion, defaults.g_ambocclusion, "G_AMBOCCLUSION", *args) + saveFunc(settings.g_fog, defaults.g_fog, "G_FOG", *args) + saveFunc(settings.g_lighting, defaults.g_lighting, "G_LIGHTING", *args) + saveFunc(settings.g_tex_gen, defaults.g_tex_gen, "G_TEXTURE_GEN", *args) + saveFunc(settings.g_tex_gen_linear, defaults.g_tex_gen_linear, "G_TEXTURE_GEN_LINEAR", *args) + saveFunc(settings.g_lod, defaults.g_lod, "G_LOD", *args) + saveFunc(settings.g_shade_smooth, defaults.g_shade_smooth, "G_SHADING_SMOOTH", *args) + if bpy.context.scene.pointLighting: + saveFunc(settings.g_lighting_positional, defaults.g_lighting_positional, "G_LIGHTING_POSITIONAL", *args) + if isUcodeF3DEX1(bpy.context.scene.f3d_type): + saveFunc(settings.g_clipping, defaults.g_clipping, "G_CLIPPING", *args) + + def saveGeoModeDefinitionF3DEX2(fMaterial, settings, defaults, matWriteMethod): geo = SPGeometryMode([], []) - - saveBitGeoF3DEX2(settings.g_zbuffer, defaults.g_zbuffer, "G_ZBUFFER", geo, matWriteMethod) - saveBitGeoF3DEX2(settings.g_shade, defaults.g_shade, "G_SHADE", geo, matWriteMethod) - saveBitGeoF3DEX2(settings.g_cull_front, defaults.g_cull_front, "G_CULL_FRONT", geo, matWriteMethod) - saveBitGeoF3DEX2(settings.g_cull_back, defaults.g_cull_back, "G_CULL_BACK", geo, matWriteMethod) - saveBitGeoF3DEX2(settings.g_fog, defaults.g_fog, "G_FOG", geo, matWriteMethod) - saveBitGeoF3DEX2(settings.g_lighting, defaults.g_lighting, "G_LIGHTING", geo, matWriteMethod) - - # make sure normals are saved correctly. - saveBitGeoF3DEX2(settings.g_tex_gen, defaults.g_tex_gen, "G_TEXTURE_GEN", geo, matWriteMethod) - saveBitGeoF3DEX2(settings.g_tex_gen_linear, defaults.g_tex_gen_linear, "G_TEXTURE_GEN_LINEAR", geo, matWriteMethod) - saveBitGeoF3DEX2(settings.g_shade_smooth, defaults.g_shade_smooth, "G_SHADING_SMOOTH", geo, matWriteMethod) - saveBitGeoF3DEX2(settings.g_clipping, defaults.g_clipping, "G_CLIPPING", geo, matWriteMethod) + saveGeoModeCommon(saveBitGeoF3DEX2, settings, defaults, (geo, matWriteMethod)) if len(geo.clearFlagList) != 0 or len(geo.setFlagList) != 0: if len(geo.clearFlagList) == 0: @@ -1542,33 +1437,11 @@ def saveGeoModeDefinitionF3DEX2(fMaterial, settings, defaults, matWriteMethod): fMaterial.revert.commands.append(SPGeometryMode(geo.setFlagList, geo.clearFlagList)) -def saveBitGeo(value, defaultValue, flagName, setGeo, clearGeo, matWriteMethod): - if value != defaultValue or matWriteMethod == GfxMatWriteMethod.WriteAll: - if value: - setGeo.flagList.append(flagName) - else: - clearGeo.flagList.append(flagName) - - def saveGeoModeDefinition(fMaterial, settings, defaults, matWriteMethod): setGeo = SPSetGeometryMode([]) clearGeo = SPClearGeometryMode([]) - saveBitGeo(settings.g_zbuffer, defaults.g_zbuffer, "G_ZBUFFER", setGeo, clearGeo, matWriteMethod) - saveBitGeo(settings.g_shade, defaults.g_shade, "G_SHADE", setGeo, clearGeo, matWriteMethod) - saveBitGeo(settings.g_cull_front, defaults.g_cull_front, "G_CULL_FRONT", setGeo, clearGeo, matWriteMethod) - saveBitGeo(settings.g_cull_back, defaults.g_cull_back, "G_CULL_BACK", setGeo, clearGeo, matWriteMethod) - saveBitGeo(settings.g_fog, defaults.g_fog, "G_FOG", setGeo, clearGeo, matWriteMethod) - saveBitGeo(settings.g_lighting, defaults.g_lighting, "G_LIGHTING", setGeo, clearGeo, matWriteMethod) - - # make sure normals are saved correctly. - saveBitGeo(settings.g_tex_gen, defaults.g_tex_gen, "G_TEXTURE_GEN", setGeo, clearGeo, matWriteMethod) - saveBitGeo( - settings.g_tex_gen_linear, defaults.g_tex_gen_linear, "G_TEXTURE_GEN_LINEAR", setGeo, clearGeo, matWriteMethod - ) - saveBitGeo(settings.g_shade_smooth, defaults.g_shade_smooth, "G_SHADING_SMOOTH", setGeo, clearGeo, matWriteMethod) - if bpy.context.scene.f3d_type == "F3DEX_GBI_2" or bpy.context.scene.f3d_type == "F3DEX_GBI": - saveBitGeo(settings.g_clipping, defaults.g_clipping, "G_CLIPPING", setGeo, clearGeo, matWriteMethod) + saveGeoModeCommon(saveBitGeo, settings, defaults, (setGeo, clearGeo, matWriteMethod)) if len(setGeo.flagList) > 0: fMaterial.mat_only_DL.commands.append(setGeo) diff --git a/fast64_internal/sm64/sm64_geolayout_writer.py b/fast64_internal/sm64/sm64_geolayout_writer.py index 33c6a33..2811db9 100644 --- a/fast64_internal/sm64/sm64_geolayout_writer.py +++ b/fast64_internal/sm64/sm64_geolayout_writer.py @@ -62,7 +62,6 @@ from ..utility import ( from ..f3d.f3d_material import ( isTexturePointSampled, - isLightingDisabled, ) from ..f3d.f3d_writer import ( @@ -78,7 +77,6 @@ from ..f3d.f3d_writer import ( saveMeshWithLargeTexturesByFaces, saveMeshByFaces, getF3DVert, - convertVertexData, ) from ..f3d.f3d_gbi import ( @@ -2635,8 +2633,7 @@ def splitSkinnedFacesIntoTwoGroups(skinnedFaces, fModel, obj, uv_data, drawLayer material = obj.material_slots[material_index].material fMaterial, texDimensions = saveOrGetF3DMaterial(material, fModel, obj, drawLayer, convertTextureData) - exportVertexColors = isLightingDisabled(material) - convertInfo = LoopConvertInfo(uv_data, obj, exportVertexColors) + convertInfo = LoopConvertInfo(uv_data, obj, material) for skinnedFace in skinnedFaceArray: for (face, loop) in skinnedFace.loopsInGroup: f3dVert = getF3DVert(loop, face, convertInfo, obj.data) @@ -2723,7 +2720,6 @@ def saveSkinnedMeshByMaterial( materialKey = (material, drawLayerKey, fModel.global_data.getCurrentAreaKey(material)) fMaterial, texDimensions = fModel.getMaterialAndHandleShared(materialKey) isPointSampled = isTexturePointSampled(material) - exportVertexColors = isLightingDisabled(material) skinnedTriGroup = fSkinnedMesh.tri_group_new(fMaterial) fSkinnedMesh.draw.commands.append(SPDisplayList(fMaterial.material)) @@ -2735,16 +2731,11 @@ def saveSkinnedMeshByMaterial( for bufferVert in vertData: skinnedTriGroup.vertexList.vertices.append( - convertVertexData( + bufferVert.f3dVert.toVtx( obj.data, - bufferVert.f3dVert.position, - bufferVert.f3dVert.uv, - bufferVert.f3dVert.stOffset, - bufferVert.f3dVert.getColorOrNormal(), texDimensions, parentMatrix, isPointSampled, - exportVertexColors, ) ) @@ -2803,7 +2794,6 @@ def saveSkinnedMeshByMaterial( # fMaterial, texDimensions = \ # saveOrGetF3DMaterial(material, fModel, obj, drawLayer, convertTextureData) # isPointSampled = isTexturePointSampled(material) - # exportVertexColors = isLightingDisabled(material) # # triGroup = fMesh.tri_group_new(fMaterial) # fMesh.draw.commands.append(SPDisplayList(fMaterial.material)) @@ -2811,14 +2801,14 @@ def saveSkinnedMeshByMaterial( # if fMaterial.revert is not None: # fMesh.draw.commands.append(SPDisplayList(fMaterial.revert)) # - # convertInfo = LoopConvertInfo(uv_data, obj, exportVertexColors) + # convertInfo = LoopConvertInfo(uv_data, obj, material) # triConverter = TriangleConverter(triConverterInfo, texDimensions, material, # None, triGroup.triList, triGroup.vertexList, copy.deepcopy(existingVertData), copy.deepcopy(matRegionDict)) # saveTriangleStrip(triConverter, [skinnedFace.bFace for skinnedFace in skinnedFaceArray], None, obj.data, True) # saveTriangleStrip(triConverterClass, # [skinnedFace.bFace for skinnedFace in skinnedFaceArray], None, # convertInfo, triGroup.triList, triGroup.vertexList, fModel.f3d, - # texDimensions, currentMatrix, isPointSampled, exportVertexColors, + # texDimensions, currentMatrix, isPointSampled, # copy.deepcopy(existingVertData), copy.deepcopy(matRegionDict), # infoDict, obj.data, None, True) diff --git a/fast64_internal/utility.py b/fast64_internal/utility.py index be8bc51..1f437de 100644 --- a/fast64_internal/utility.py +++ b/fast64_internal/utility.py @@ -1,5 +1,5 @@ import bpy, random, string, os, math, traceback, re, os, mathutils, ast, operator -from math import pi, ceil, degrees, radians +from math import pi, ceil, degrees, radians, copysign from mathutils import * from .utility_anim import * from typing import Callable, Iterable, Any @@ -600,6 +600,17 @@ to_s16 = lambda x: cast_integer(round(x), 16, True) radians_to_s16 = lambda d: to_s16(d * 0x10000 / (2 * math.pi)) +def from_s16(value: int): + value &= 0xFFFF + if value >= 0x8000: + value -= 0x10000 + return value + + +def from_s16_str(value: str): + return from_s16(int(value)) + + def decompFolderMessage(layout): layout.box().label(text="This will export to your decomp folder.") @@ -1425,13 +1436,54 @@ def normToSigned8Vector(normal): return [int.from_bytes(int(value * 127).to_bytes(1, "big", signed=True), "big") for value in normal] -# Normal values are signed bytes (-128 to 127) -# Normalized magnitude = 127 -def convertNormal(normal): - F3DNormal = bytearray(0) - for axis in normal: - F3DNormal.extend(int(axis * 127).to_bytes(1, "big", signed=True)) - return F3DNormal +def unpackNormalS8(packedNormal): + assert isinstance(packedNormal, int) and packedNormal >= 0 and packedNormal <= 0xFFFF + xo, yo = packedNormal >> 8, packedNormal & 0xFF + # This is following the instructions in F3DEX3 + x, y = xo & 0x7F, yo & 0x7F + z = x + y + zNeg = bool(z & 0x80) + x2, y2 = x ^ 0x7F, y ^ 0x7F # 7F - x, 7F - y + z = z ^ 0x7F # = 7F - x - y + if zNeg: + x, y = x2, y2 + x, y = -x if xo & 0x80 else x, -y if yo & 0x80 else y + z = z - 0x100 if z & 0x80 else z + assert abs(x) + abs(y) + abs(z) == 127 + return x, y, z + + +def unpackNormal(packedNormal): + # Convert constant-L1 norm to standard L2 norm + return Vector(unpackNormalS8(packedNormal)).normalized() + + +def packNormal(normal): + # Convert standard normal to constant-L1 normal + assert len(normal) == 3 + l1norm = abs(normal[0]) + abs(normal[1]) + abs(normal[2]) + xo, yo, zo = tuple([int(round(a * 127.0 / l1norm)) for a in normal]) + if abs(xo) + abs(yo) > 127: + yo = int(math.copysign(127 - abs(xo), yo)) + zo = int(math.copysign(127 - abs(xo) - abs(yo), zo)) + assert abs(xo) + abs(yo) + abs(zo) == 127 + # Pack normals + xsign, ysign = xo & 0x80, yo & 0x80 + x, y = abs(xo), abs(yo) + if zo < 0: + x, y = 0x7F - x, 0x7F - y + x, y = x | xsign, y | ysign + packedNormal = x << 8 | y + assert (xo, yo, zo) == unpackNormalS8(packedNormal) + return packedNormal + + +def getRgbNormalSettings(material): + rdp_settings = material.f3d_mat.rdp_settings + has_packed_normals = bpy.context.scene.f3d_type == "F3DEX3" + has_rgb = not rdp_settings.g_lighting or (has_packed_normals and rdp_settings.g_packed_normals) + has_normal = rdp_settings.g_lighting + return has_rgb, has_normal, has_packed_normals def byteMask(data, offset, amount): From 6693471ce2982bf278aa0f09de9ddba4ff347450 Mon Sep 17 00:00:00 2001 From: Sauraen Date: Tue, 10 Oct 2023 22:24:02 -0700 Subject: [PATCH 17/74] Ported geom UI working --- fast64_internal/f3d/f3d_enums.py | 10 ++-- fast64_internal/f3d/f3d_gbi.py | 12 ++++- fast64_internal/f3d/f3d_material.py | 79 +++++++++++++++++++++-------- fast64_internal/f3d/f3d_writer.py | 13 +++-- 4 files changed, 82 insertions(+), 32 deletions(-) diff --git a/fast64_internal/f3d/f3d_enums.py b/fast64_internal/f3d/f3d_enums.py index 0fa09a7..c979994 100644 --- a/fast64_internal/f3d/f3d_enums.py +++ b/fast64_internal/f3d/f3d_enums.py @@ -357,13 +357,13 @@ maxTexelCount = { } enumF3D = [ - ("F3D", "F3D", "F3D"), - ("F3DEX/LX", "F3DEX/LX", "F3DEX/LX"), + ("F3D", "F3D", "Original microcode used in SM64"), + ("F3DEX/LX", "F3DEX/LX", "F3DEX version 1"), ("F3DLX.Rej", "F3DLX.Rej", "F3DLX.Rej"), ("F3DLP.Rej", "F3DLP.Rej", "F3DLP.Rej"), - ("F3DEX2/LX2", "F3DEX2/LX2", "F3DEX2/LX2"), - ("F3DEX2.Rej/LX2.Rej", "F3DEX2.Rej/LX2.Rej", "F3DEX2.Rej/LX2.Rej"), - ("F3DEX3", "F3DEX3", "F3DEX3"), + ("F3DEX2/LX2", "F3DEX2/LX2/ZEX", "Family of microcodes used in later N64 games including OoT and MM"), + ("F3DEX2.Rej/LX2.Rej", "F3DEX2.Rej/LX2.Rej", "Variant of F3DEX2 family using vertex rejection instead of clipping"), + ("F3DEX3", "F3DEX3", "Custom microcode by Sauraen"), ] enumLargeEdges = [ diff --git a/fast64_internal/f3d/f3d_gbi.py b/fast64_internal/f3d/f3d_gbi.py index b5aaac9..eee8dfa 100644 --- a/fast64_internal/f3d/f3d_gbi.py +++ b/fast64_internal/f3d/f3d_gbi.py @@ -368,7 +368,7 @@ class F3D: "G_CLIPPING", } if F3DEX_GBI_3: - self.allGeomModeFlags += { + self.allGeomModeFlags |= { "G_ATTROFFSET_ST_ENABLE", "G_ATTROFFSET_Z_ENABLE", "G_PACKED_NORMALS", @@ -3342,6 +3342,7 @@ def gsSPNoOp(f3d): class GbiMacro: _segptrs = False _ptr_amp = False + _hex = 0 # If nonzero, write int values as hex with specified digits tags = GfxTag(0) """ @@ -3374,6 +3375,9 @@ class GbiMacro: return field.name if hasattr(field, "__iter__") and type(field) is not str: return " | ".join(field) if len(field) else "0" + if _hex > 0 and isinstance(field, int): + temp = field if field >= 0 else (1 << (_hex * 4)) + field + return f"{0:#0{1}x}".format(temp, _hex) return str(field) def to_c(self, static=True): @@ -3727,6 +3731,7 @@ class SPClipRatio(GbiMacro): class SPAmbOcclusion(GbiMacro): amb: int dir: int + _hex = 4 def to_binary(self, f3d, segments): if not f3d.F3DEX_GBI_3: @@ -3739,6 +3744,7 @@ class SPAmbOcclusion(GbiMacro): class SPFresnel(GbiMacro): offset: int scale: int + _hex = 4 def to_binary(self, f3d, segments): if not f3d.F3DEX_GBI_3: @@ -3751,6 +3757,7 @@ class SPFresnel(GbiMacro): class SPAttrOffsetST(GbiMacro): s: int t: int + _hex = 4 def to_binary(self, f3d, segments): if not f3d.F3DEX_GBI_3: @@ -3762,6 +3769,7 @@ class SPAttrOffsetST(GbiMacro): @dataclass(unsafe_hash=True) class SPAttrOffsetZ(GbiMacro): z: int + _hex = 4 def to_binary(self, f3d, segments): if not f3d.F3DEX_GBI_3: @@ -4681,7 +4689,7 @@ class SPLightToRDP(GbiMacro): def to_binary(self, f3d, segments): if not f3d.F3DEX_GBI_3: raise PluginError("SPLightToRDP requires F3DEX3 microcode") - word = _SHIFTL(f3d.G_LIGHTTORDP, 24, 8) | _SHIFTL(self.light * 0x10, 8, 8) | _SHIFTL(self.alpha, 0, 8)) + word = _SHIFTL(f3d.G_LIGHTTORDP, 24, 8) | _SHIFTL(self.light * 0x10, 8, 8) | _SHIFTL(self.alpha, 0, 8) return word.to_bytes(4, "big") + self.word0.to_bytes(4, "big") diff --git a/fast64_internal/f3d/f3d_material.py b/fast64_internal/f3d/f3d_material.py index 2b621fb..3f3b960 100644 --- a/fast64_internal/f3d/f3d_material.py +++ b/fast64_internal/f3d/f3d_material.py @@ -428,6 +428,7 @@ def ui_geo_mode(settings, dataHolder, layout, useDropdown): return c isF3DEX3 = bpy.context.scene.f3d_type == "F3DEX3" + lightFxPrereq = isF3DEX3 and settings.g_lighting if isinstance(dataHolder, F3DMaterialProperty): ccWarnings = blendWarnings = True ccUse = all_combiner_uses(dataHolder) @@ -455,22 +456,37 @@ def ui_geo_mode(settings, dataHolder, layout, useDropdown): if d is not None: d.prop(settings, "g_tex_gen_linear") - light_to_alpha_prereq = isF3DEX3 and settings.g_lighting + shadowMapInShadeAlpha = False if settings.g_fog: shadeAlphaLabel = "Fog" - elif light_to_alpha_prereq and settings.g_lighttoalpha: + elif lightFxPrereq and settings.g_fresnel: + shadeAlphaLabel = "Fresnel" + elif lightFxPrereq and settings.g_lighttoalpha: shadeAlphaLabel = "Light intensity" + elif lightFxPrereq and settings.g_ambocclusion: + shadeAlphaLabel = "Shadow map / AO in vtx alpha" + shadowMapInShadeAlpha = True else: shadeAlphaLabel = "Vtx alpha" c = indentGroup(inputGroup, f"Shade alpha = {shadeAlphaLabel}:", True) - if light_to_alpha_prereq: + if lightFxPrereq: c.prop(settings, "g_lighttoalpha") + c.prop(settings, "g_fresnel") c.prop(settings, "g_fog") - if light_to_alpha_prereq and settings.g_lighttoalpha and settings.g_fog: + + if lightFxPrereq and settings.g_fog and settings.g_fresnel: + c.label(text="Fog overrides Fresnel.", icon="ERROR") + elif lightFxPrereq and settings.g_fog and settings.g_lighttoalpha: c.label(text="Fog overrides Light-to-Alpha.", icon="ERROR") + elif lightFxPrereq and settings.g_fresnel and settings.g_lighttoalpha: + c.label(text="Fresnel overrides Light-to-Alpha.", icon="ERROR") + if shadowMapInShadeAlpha and ccUse["Shade Alpha"]: + c.label(text="Shadow map = shade alpha used in CC.", icon="INFO") + if settings.g_fog and ccUse["Shade Alpha"]: + c.label(text="Fog = shade alpha used in CC.", icon="INFO") if blendWarnings and shadeInBlender and not settings.g_fog: c.label(text="Rendermode uses shade alpha, probably fog.", icon="INFO") - if blendWarnings and not shadeInBlender and settings.g_fog: + elif blendWarnings and not shadeInBlender and settings.g_fog: c.label(text="Fog not used in rendermode / blender, can disable.", icon="INFO") if isF3DEX3: @@ -894,13 +910,36 @@ class F3DPanel(bpy.types.Panel): prop_split(inputGroup.row(), f3dMat, "fog_color", "Fog Color") prop_split(inputGroup.row(), f3dMat, "fog_position", "Fog Range") - def drawVertexColorNotice(self, layout): + def checkDrawLayersWarnings(self, f3dMat, useDict, layout): + settings = f3dMat.rdp_settings + isF3DEX3 = bpy.context.scene.f3d_type == "F3DEX3" + lightFxPrereq = isF3DEX3 and settings.g_lighting + + blendUse = all_blender_uses(settings) + anyUseShadeAlpha = useDict["Shade Alpha"] or blendUse["Shade Alpha"] + + g_lighting = settings.g_lighting + g_fog = settings.g_fog + g_packed_normals = lightFxPrereq and settings.g_packed_normals + g_ambocclusion = lightFxPrereq and settings.g_ambocclusion + g_lighttoalpha = lightFxPrereq and settings.g_lighttoalpha + g_fresnel = lightFxPrereq and settings.g_fresnel + + usesVertexColor = useDict["Shade"] and (not g_lighting or g_packed_normals) + usesVertexAlpha = anyUseShadeAlpha and (g_ambocclusion or not ( + g_fog or g_lighttoalpha or g_fresnel + )) + if not usesVertexColor and not usesVertexAlpha: + return noticeBox = layout.box().column() - noticeBox.label(text="There must be two vertex color layers.", icon="LINENUMBERS_ON") - noticeBox.label(text='They should be called "Col" and "Alpha".') - - def drawShadeAlphaNotice(self, layout): - layout.box().column().label(text='There must be a vertex color layer called "Alpha".', icon="IMAGE_ALPHA") + if not usesVertexColor: + noticeBox.label(text='There must be a vertex color layer called "Alpha".', icon="IMAGE_ALPHA") + elif not usesVertexAlpha: + noticeBox.label(text='There must be a vertex color layer called "Col".', icon="IMAGE_RGB_ALPHA") + else: + noticeBox.label(text="There must be two vertex color layers.", icon="IMAGE_RGB_ALPHA") + noticeBox.label(text='They must be called "Col" and "Alpha".', icon="IMAGE_ALPHA") + def checkDrawMixedCIWarning(self, layout, useDict, f3dMat): useTex0 = useDict["Texture 0"] and f3dMat.tex0.tex_set @@ -920,10 +959,7 @@ class F3DPanel(bpy.types.Panel): inputCol = layout.column() useDict = all_combiner_uses(f3dMat) - if not f3dMat.rdp_settings.g_lighting: - self.drawVertexColorNotice(layout) - elif useDict["Shade Alpha"]: - self.drawShadeAlphaNotice(layout) + self.checkDrawLayersWarnings(f3dMat, useDict, layout) useMultitexture = useDict["Texture 0"] and useDict["Texture 1"] and f3dMat.tex0.tex_set and f3dMat.tex1.tex_set @@ -968,10 +1004,7 @@ class F3DPanel(bpy.types.Panel): if menuTab == "Combiner": self.ui_draw_layer(material, layout, context) - if not f3dMat.rdp_settings.g_lighting: - self.drawVertexColorNotice(layout) - elif useDict["Shade Alpha"]: - self.drawShadeAlphaNotice(layout) + self.checkDrawLayersWarnings(f3dMat, useDict, layout) combinerBox = layout.box() combinerBox.prop(f3dMat, "set_combiner", text="Color Combiner (Color = (A - B) * C + D)") @@ -4056,7 +4089,13 @@ def mat_register(): items=enumF3D, default="F3D", ) - bpy.types.Scene.isHWv1 = bpy.props.BoolProperty(name="Is Hardware v1?") + bpy.types.Scene.isHWv1 = bpy.props.BoolProperty( + name="Is Hardware v1?", + default=False, + description=("Only early N64 devkits have V1 RCP chips; all retail consoles have V2. " + + "Display lists made for V1 and V2 are incompatible with each other, " + + "so any hardware which can play retail games is V2") + ) # RDP Defaults bpy.types.World.rdp_defaults = bpy.props.PointerProperty(type=RDPSettings) diff --git a/fast64_internal/f3d/f3d_writer.py b/fast64_internal/f3d/f3d_writer.py index 8d75e40..30bc553 100644 --- a/fast64_internal/f3d/f3d_writer.py +++ b/fast64_internal/f3d/f3d_writer.py @@ -1173,19 +1173,22 @@ def saveOrGetF3DMaterial(material, fModel, obj, drawLayer, convertTextureData): if f3dMat.set_ao: fMaterial.mat_only_DL.commands.append( SPAmbOcclusion( - hex(round(f3dMat.ao_ambient * 2**16)), - hex(round(f3dMat.ao_directional * 2**16)) + round(f3dMat.ao_ambient * 2**16), + round(f3dMat.ao_directional * 2**16), ) ) if f3dMat.set_fresnel: - TODO() + offset = min(round(f3dMat.fresnel_lo * 2**15), 0x7FFF) + scalePre = 256.0 / (f3dMat.fresnel_hi - f3dMat.fresnel_lo) + scale = max(min(round(scalePre), 0x7FFF), -0x8000) + fMaterial.mat_only_DL.commands.append(SPFresnel(offset, scale)) if f3dMat.set_attroffs_st: fMaterial.mat_only_DL.commands.append( SPAttrOffsetST( - hex(to_s16(f3dMat.attroffs_st[0] * 32)), - hex(to_s16(f3dMat.attroffs_st[1] * 32)), + to_s16(f3dMat.attroffs_st[0] * 32), + to_s16(f3dMat.attroffs_st[1] * 32), ) ) From a285db3c41e8f3f06f729024576cc0f2b58c1155 Mon Sep 17 00:00:00 2001 From: Yanis42 <35189056+Yanis42@users.noreply.github.com> Date: Wed, 11 Oct 2023 17:17:41 +0200 Subject: [PATCH 18/74] improved "add path" button --- fast64_internal/oot/oot_utility.py | 71 +++++++++++++++++++++++++- fast64_internal/oot/tools/operators.py | 38 +++++++++++--- 2 files changed, 102 insertions(+), 7 deletions(-) diff --git a/fast64_internal/oot/oot_utility.py b/fast64_internal/oot/oot_utility.py index 1d7ca39..2a2f8ce 100644 --- a/fast64_internal/oot/oot_utility.py +++ b/fast64_internal/oot/oot_utility.py @@ -1,5 +1,10 @@ -import bpy, math, os, re +import bpy +import math +import os +import re + from ast import parse, Expression, Num, UnaryOp, USub, Invert, BinOp +from mathutils import Vector from bpy.utils import register_class, unregister_class from typing import Callable from .oot_constants import ootSceneIDToName @@ -861,3 +866,67 @@ def getEvalParams(input: str): raise ValueError(f"Unsupported AST node {node}") return f"0x{_eval(node.body):X}" + + +def getNewPath(type: str, isClosedShape: bool): + """ + type: the path's type (square, line, circle, etc) + radius: how big the shape will be + """ + + # create a new curve + newCurve = bpy.data.curves.new("New Path", "CURVE") + newCurve.dimensions = "3D" + + # add a new spline to the curve + newSpline = newCurve.splines.new("NURBS") # comes with 1 point + + # generate shape based on 'type' parameter + scaleDivBy2 = bpy.context.scene.ootBlenderScale / 2 + match type: + case "Line": + newSpline.points.add(1) + for i, point in enumerate(newSpline.points): + point.co.x = i * bpy.context.scene.ootBlenderScale + point.co.w = 1 + case "Triangle": + newSpline.points.add(2) + for i, point in enumerate(newSpline.points): + point.co.x = i * scaleDivBy2 + if i == 1: + point.co.y = (len(newSpline.points) * scaleDivBy2) / 2 + point.co.w = 1 + case "Square" | "Trapezium": + newSpline.points.add(3) + for i, point in enumerate(newSpline.points): + point.co.x = i * scaleDivBy2 + if i in [1, 2]: + if type == "Square": + point.co.y = (len(newSpline.points) - 1) * scaleDivBy2 + if i == 1: + point.co.x = newSpline.points[0].co.x + else: + point.co.x = point.co.y + else: + point.co.y = 1 * scaleDivBy2 + point.co.w = 1 + case _: + raise PluginError("ERROR: Invalid Path Type!") + + if isClosedShape and type != "Line": + newSpline.points.add(1) + newSpline.points[-1].co = newSpline.points[0].co + + # make the curve's display accurate to the point's shape + newSpline.use_cyclic_u = True + newSpline.use_endpoint_u = False + newSpline.resolution_u = 64 + newSpline.order_u = 2 + + # create a new object and add the curve as data + newPath = bpy.data.objects.new("New Path", newCurve) + newPath.show_name = True + newPath.location = Vector(bpy.context.scene.cursor.location) + bpy.context.scene.collection.objects.link(newPath) + + return newPath diff --git a/fast64_internal/oot/tools/operators.py b/fast64_internal/oot/tools/operators.py index 03b73e1..a7069a9 100644 --- a/fast64_internal/oot/tools/operators.py +++ b/fast64_internal/oot/tools/operators.py @@ -1,9 +1,10 @@ from mathutils import Vector from bpy.ops import mesh, object, curve from bpy.types import Operator -from bpy.props import FloatProperty, StringProperty +from bpy.props import FloatProperty, StringProperty, EnumProperty, BoolProperty from ...operators import AddWaterBox, addMaterialByName from ...utility import parentObject, setOrigin +from ..oot_utility import getNewPath class OOT_AddWaterBox(AddWaterBox): @@ -164,19 +165,44 @@ class OOT_AddCutscene(Operator): class OOT_AddPath(Operator): bl_idname = "object.oot_add_path" bl_label = "Add Path" - bl_options = {"REGISTER", "UNDO", "PRESET"} + bl_options = {"REGISTER", "UNDO"} + + isClosedShape: BoolProperty(name="", default=True) + pathType: EnumProperty( + name="", + items=[ + ("Line", "Line", "Line"), + ("Square", "Square", "Square"), + ("Triangle", "Triangle", "Triangle"), + ("Trapezium", "Trapezium", "Trapezium"), + ], + default="Line", + ) def execute(self, context): if context.mode != "OBJECT": object.mode_set(mode="OBJECT") object.select_all(action="DESELECT") - location = Vector(context.scene.cursor.location) - curve.primitive_nurbs_path_add(radius=1, align="WORLD", location=location[:]) - pathObj = context.view_layer.objects.active - pathObj.name = "New Path" + pathObj = getNewPath(self.pathType, self.isClosedShape) + activeObj = context.view_layer.objects.active + if activeObj.type == "EMPTY" and activeObj.ootEmptyType == "Scene": + pathObj.parent = activeObj object.select_all(action="DESELECT") pathObj.select_set(True) context.view_layer.objects.active = pathObj return {"FINISHED"} + + def invoke(self, context, event): + return context.window_manager.invoke_props_dialog(self, width=320) + + def draw(self, context): + layout = self.layout + layout.label(text="Path Settings") + props = [("Path Type", "pathType"), ("Closed Shape", "isClosedShape")] + + for desc, propName in props: + split = layout.split(factor=0.30) + split.label(text=desc) + split.prop(self, propName) From 371255fbba6f282e9931592fc825d462d15cc4fd Mon Sep 17 00:00:00 2001 From: Yanis42 <35189056+Yanis42@users.noreply.github.com> Date: Wed, 11 Oct 2023 17:21:27 +0200 Subject: [PATCH 19/74] fix func description --- fast64_internal/oot/oot_utility.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/fast64_internal/oot/oot_utility.py b/fast64_internal/oot/oot_utility.py index 2a2f8ce..60d54ca 100644 --- a/fast64_internal/oot/oot_utility.py +++ b/fast64_internal/oot/oot_utility.py @@ -870,8 +870,11 @@ def getEvalParams(input: str): def getNewPath(type: str, isClosedShape: bool): """ - type: the path's type (square, line, circle, etc) - radius: how big the shape will be + Returns a new Curve Object with the selected spline shape + + Parameters: + - ``type``: the path's type (square, line, etc) + - ``isClosedShape``: choose if the spline should have an extra point to make a closed shape """ # create a new curve From cc3b1f70510c107ba431ed5b9efa44dc62b8d6ff Mon Sep 17 00:00:00 2001 From: Yanis42 <35189056+Yanis42@users.noreply.github.com> Date: Wed, 11 Oct 2023 17:47:51 +0200 Subject: [PATCH 20/74] fix collection --- fast64_internal/oot/oot_utility.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fast64_internal/oot/oot_utility.py b/fast64_internal/oot/oot_utility.py index 60d54ca..e175ae9 100644 --- a/fast64_internal/oot/oot_utility.py +++ b/fast64_internal/oot/oot_utility.py @@ -930,6 +930,6 @@ def getNewPath(type: str, isClosedShape: bool): newPath = bpy.data.objects.new("New Path", newCurve) newPath.show_name = True newPath.location = Vector(bpy.context.scene.cursor.location) - bpy.context.scene.collection.objects.link(newPath) + bpy.context.view_layer.active_layer_collection.collection.objects.link(newPath) return newPath From eee76f5862340f5ecc368d79e37e4f956614e2e6 Mon Sep 17 00:00:00 2001 From: Sauraen Date: Fri, 13 Oct 2023 22:29:42 -0700 Subject: [PATCH 21/74] Removed passing around GBI type and hardware V1 flag --- fast64_internal/f3d/f3d_gbi.py | 15 +++-- fast64_internal/f3d/f3d_parser.py | 8 ++- fast64_internal/f3d/f3d_writer.py | 44 ++++----------- fast64_internal/oot/f3d/operators.py | 12 +--- fast64_internal/oot/oot_level_parser.py | 6 +- fast64_internal/oot/oot_level_writer.py | 8 +-- fast64_internal/oot/oot_model_classes.py | 4 +- fast64_internal/oot/scene/operators.py | 12 +--- .../oot/skeleton/exporter/functions.py | 4 +- .../oot/skeleton/importer/functions.py | 4 +- fast64_internal/oot/skeleton/operators.py | 4 +- fast64_internal/sm64/sm64_f3d_writer.py | 38 ++++--------- fast64_internal/sm64/sm64_geolayout_parser.py | 52 ----------------- fast64_internal/sm64/sm64_geolayout_writer.py | 56 ++++--------------- fast64_internal/sm64/sm64_level_writer.py | 8 +-- 15 files changed, 66 insertions(+), 209 deletions(-) diff --git a/fast64_internal/f3d/f3d_gbi.py b/fast64_internal/f3d/f3d_gbi.py index eee8dfa..0121997 100644 --- a/fast64_internal/f3d/f3d_gbi.py +++ b/fast64_internal/f3d/f3d_gbi.py @@ -2303,8 +2303,6 @@ class FPaletteKey: class FModel: def __init__( self, - f3dType: F3D, - isHWv1: bool, name: str, DLFormat: "DLFormat", matWriteMethod: GfxMatWriteMethod, @@ -2321,7 +2319,7 @@ class FModel: # GfxList self.materialRevert: Union[GfxList, None] = None # F3D library - self.f3d: F3D = F3D(f3dType, isHWv1) + self.f3d: F3D = get_F3D_GBI() # array of FModel self.subModels: list[FModel] = [] self.parentModel: Union[FModel, None] = None @@ -2727,9 +2725,9 @@ class FModel: class FTexRect(FModel): - def __init__(self, f3dType, isHWv1, name, matWriteMethod): + def __init__(self, name, matWriteMethod): self.draw = GfxList(name, GfxListTag.Draw, DLFormat.Dynamic) - FModel.__init__(self, f3dType, isHWv1, name, DLFormat, matWriteMethod) + FModel.__init__(self, name, DLFormat, matWriteMethod) def to_c(self, savePNG, texDir, gfxFormatter): staticData = CData() @@ -3375,9 +3373,10 @@ class GbiMacro: return field.name if hasattr(field, "__iter__") and type(field) is not str: return " | ".join(field) if len(field) else "0" - if _hex > 0 and isinstance(field, int): - temp = field if field >= 0 else (1 << (_hex * 4)) + field - return f"{0:#0{1}x}".format(temp, _hex) + if self._hex > 0 and isinstance(field, int): + temp = field if field >= 0 else (1 << (self._hex * 4)) + field + print(f"{temp}, {self._hex}") + return "{0:#0{1}x}".format(temp, self._hex + 2) # + 2 for the 0x part return str(field) def to_c(self, static=True): diff --git a/fast64_internal/f3d/f3d_parser.py b/fast64_internal/f3d/f3d_parser.py index 22357cd..8dc5614 100644 --- a/fast64_internal/f3d/f3d_parser.py +++ b/fast64_internal/f3d/f3d_parser.py @@ -453,6 +453,8 @@ class F3DParsedCommands: class F3DContext: def __init__(self, f3d: F3D, basePath: str, materialContext: bpy.types.Material): self.f3d: F3D = f3d + if not self.f3d.F3DEX_GBI_3: + print("\n\nF3D at creation of F3DContext is not F3DEX3!\n\n") self.basePath: str = basePath self.materialContext: bpy.types.Material = materialContext self.materialContext.f3d_update_flag = True # Don't want visual updates while parsing @@ -872,6 +874,8 @@ class F3DContext: mat = self.mat() bitFlags = math_eval(command.params[0], self.f3d) + assert self.f3d.F3DEX_GBI_3 + if bitFlags & self.f3d.G_ZBUFFER: mat.rdp_settings.g_zbuffer = value if bitFlags & self.f3d.G_SHADE: @@ -2272,8 +2276,6 @@ class F3D_ImportDL(bpy.types.Operator): removeDoubles = context.scene.DLRemoveDoubles importNormals = context.scene.DLImportNormals drawLayer = context.scene.DLImportDrawLayer - f3dType = context.scene.f3d_type - isHWv1 = context.scene.isHWv1 data = getImportData([importPath]) @@ -2284,7 +2286,7 @@ class F3D_ImportDL(bpy.types.Operator): removeDoubles, importNormals, drawLayer, - F3DContext(F3D(f3dType, isHWv1), basePath, createF3DMat(None)), + F3DContext(get_F3D_GBI(), basePath, createF3DMat(None)), ) self.report({"INFO"}, "Success!") diff --git a/fast64_internal/f3d/f3d_writer.py b/fast64_internal/f3d/f3d_writer.py index 30bc553..2f3cc25 100644 --- a/fast64_internal/f3d/f3d_writer.py +++ b/fast64_internal/f3d/f3d_writer.py @@ -413,7 +413,6 @@ def addCullCommand(obj, fMesh, transformMatrix, matWriteMethod): F3DVert( Vector(vertexPos), [0, 0], - None, Vector([0, 0, 0]), None, 0.0, @@ -1173,8 +1172,8 @@ def saveOrGetF3DMaterial(material, fModel, obj, drawLayer, convertTextureData): if f3dMat.set_ao: fMaterial.mat_only_DL.commands.append( SPAmbOcclusion( - round(f3dMat.ao_ambient * 2**16), - round(f3dMat.ao_directional * 2**16), + min(round(f3dMat.ao_ambient * 2**16), 0xFFFF), + min(round(f3dMat.ao_directional * 2**16), 0xFFFF), ) ) @@ -1400,25 +1399,19 @@ def saveGeoModeCommon(saveFunc, settings, defaults, args): saveFunc(settings.g_shade, defaults.g_shade, "G_SHADE", *args) saveFunc(settings.g_cull_front, defaults.g_cull_front, "G_CULL_FRONT", *args) saveFunc(settings.g_cull_back, defaults.g_cull_back, "G_CULL_BACK", *args) - if bpy.context.scene.isCustomUcode: - cu = bpy.context.scene.customUcode - if cu.has_attr_offsets: - saveFunc(settings.g_attroffset_st_enable, defaults.g_attroffset_st_enable, "G_ATTROFFSET_ST_ENABLE", *args) - saveFunc(settings.g_attroffset_z_enable, defaults.g_attroffset_z_enable, "G_ATTROFFSET_Z_ENABLE", *args) - if cu.has_packed_normals: - saveFunc(settings.g_packed_normals, defaults.g_packed_normals, "G_PACKED_NORMALS", *args) - if cu.has_light_to_alpha: - saveFunc(settings.g_lighttoalpha, defaults.g_lighttoalpha, "G_LIGHTTOALPHA", *args) - if cu.has_ambient_occlusion: - saveFunc(settings.g_ambocclusion, defaults.g_ambocclusion, "G_AMBOCCLUSION", *args) + if bpy.context.scene.f3d_type == "F3DEX3": + saveFunc(settings.g_attroffset_st_enable, defaults.g_attroffset_st_enable, "G_ATTROFFSET_ST_ENABLE", *args) + saveFunc(settings.g_attroffset_z_enable, defaults.g_attroffset_z_enable, "G_ATTROFFSET_Z_ENABLE", *args) + saveFunc(settings.g_packed_normals, defaults.g_packed_normals, "G_PACKED_NORMALS", *args) + saveFunc(settings.g_lighttoalpha, defaults.g_lighttoalpha, "G_LIGHTTOALPHA", *args) + saveFunc(settings.g_ambocclusion, defaults.g_ambocclusion, "G_AMBOCCLUSION", *args) + saveFunc(settings.g_fresnel, defaults.g_fresnel, "G_FRESNEL", *args) saveFunc(settings.g_fog, defaults.g_fog, "G_FOG", *args) saveFunc(settings.g_lighting, defaults.g_lighting, "G_LIGHTING", *args) saveFunc(settings.g_tex_gen, defaults.g_tex_gen, "G_TEXTURE_GEN", *args) saveFunc(settings.g_tex_gen_linear, defaults.g_tex_gen_linear, "G_TEXTURE_GEN_LINEAR", *args) saveFunc(settings.g_lod, defaults.g_lod, "G_LOD", *args) saveFunc(settings.g_shade_smooth, defaults.g_shade_smooth, "G_SHADING_SMOOTH", *args) - if bpy.context.scene.pointLighting: - saveFunc(settings.g_lighting_positional, defaults.g_lighting_positional, "G_LIGHTING_POSITIONAL", *args) if isUcodeF3DEX1(bpy.context.scene.f3d_type): saveFunc(settings.g_clipping, defaults.g_clipping, "G_CLIPPING", *args) @@ -1494,29 +1487,18 @@ def saveOtherModeHDefinitionAll(fMaterial, settings, tlut, defaults, isHWv1, f3d def saveOtherModeHDefinitionIndividual(fMaterial, settings, tlut, defaults, isHWv1): saveModeSetting(fMaterial, settings.g_mdsft_alpha_dither, defaults.g_mdsft_alpha_dither, DPSetAlphaDither) - if not isHWv1: saveModeSetting(fMaterial, settings.g_mdsft_rgb_dither, defaults.g_mdsft_rgb_dither, DPSetColorDither) - saveModeSetting(fMaterial, settings.g_mdsft_combkey, defaults.g_mdsft_combkey, DPSetCombineKey) - saveModeSetting(fMaterial, settings.g_mdsft_textconv, defaults.g_mdsft_textconv, DPSetTextureConvert) - saveModeSetting(fMaterial, settings.g_mdsft_text_filt, defaults.g_mdsft_text_filt, DPSetTextureFilter) - saveModeSetting(fMaterial, tlut, "G_TT_NONE", DPSetTextureLUT) - saveModeSetting(fMaterial, settings.g_mdsft_textlod, defaults.g_mdsft_textlod, DPSetTextureLOD) - saveModeSetting(fMaterial, settings.g_mdsft_textdetail, defaults.g_mdsft_textdetail, DPSetTextureDetail) - saveModeSetting(fMaterial, settings.g_mdsft_textpersp, defaults.g_mdsft_textpersp, DPSetTexturePersp) - saveModeSetting(fMaterial, settings.g_mdsft_cycletype, defaults.g_mdsft_cycletype, DPSetCycleType) - if isHWv1: saveModeSetting(fMaterial, settings.g_mdsft_color_dither, defaults.g_mdsft_color_dither, DPSetColorDither) - saveModeSetting(fMaterial, settings.g_mdsft_pipeline, defaults.g_mdsft_pipeline, DPPipelineMode) @@ -1694,11 +1676,11 @@ def getWriteMethodFromEnum(enumVal): def exportF3DtoC( - dirPath, obj, DLFormat, transformMatrix, f3dType, isHWv1, texDir, savePNG, texSeparate, name, matWriteMethod + dirPath, obj, DLFormat, transformMatrix, texDir, savePNG, texSeparate, name, matWriteMethod ): inline = bpy.context.scene.exportInlineF3D - fModel = FModel(f3dType, isHWv1, name, DLFormat, matWriteMethod if not inline else GfxMatWriteMethod.WriteAll) + fModel = FModel(name, DLFormat, matWriteMethod if not inline else GfxMatWriteMethod.WriteAll) fMeshes = exportF3DCommon(obj, fModel, transformMatrix, True, name, DLFormat, not savePNG) if inline: @@ -1793,8 +1775,6 @@ class F3D_ExportDL(bpy.types.Operator): exportPath = bpy.path.abspath(context.scene.DLExportPath) dlFormat = DLFormat.Static if context.scene.DLExportisStatic else DLFormat.Dynamic - f3dType = context.scene.f3d_type - isHWv1 = context.scene.isHWv1 texDir = bpy.context.scene.DLTexDir savePNG = bpy.context.scene.saveTextures separateTexDef = bpy.context.scene.DLSeparateTextureDef @@ -1806,8 +1786,6 @@ class F3D_ExportDL(bpy.types.Operator): obj, dlFormat, finalTransform, - f3dType, - isHWv1, texDir, savePNG, separateTexDef, diff --git a/fast64_internal/oot/f3d/operators.py b/fast64_internal/oot/f3d/operators.py index b153c52..9c05b9e 100644 --- a/fast64_internal/oot/f3d/operators.py +++ b/fast64_internal/oot/f3d/operators.py @@ -6,7 +6,7 @@ from bpy.utils import register_class, unregister_class from mathutils import Matrix from ...utility import CData, PluginError, raisePluginError, writeCData, toAlnum from ...f3d.f3d_parser import importMeshC, getImportData -from ...f3d.f3d_gbi import DLFormat, F3D, TextureExportSettings, ScrollMethod +from ...f3d.f3d_gbi import DLFormat, F3D, TextureExportSettings, ScrollMethod, get_F3D_GBI from ...f3d.f3d_writer import TriangleConverterInfo, removeDL, saveStaticModel, getInfoDict from ..oot_utility import ootGetObjectPath, getOOTScale from ..oot_model_classes import OOTF3DContext, ootGetIncludedAssetData @@ -28,8 +28,6 @@ from ..oot_utility import ( def ootConvertMeshToC( originalObj: bpy.types.Object, finalTransform: mathutils.Matrix, - f3dType: str, - isHWv1: bool, DLFormat: DLFormat, saveTextures: bool, settings: OOTDLExportSettings, @@ -47,7 +45,7 @@ def ootConvertMeshToC( try: obj, allObjs = ootDuplicateHierarchy(originalObj, None, False, OOTObjectCategorizer()) - fModel = OOTModel(f3dType, isHWv1, name, DLFormat, drawLayer) + fModel = OOTModel(name, DLFormat, drawLayer) triConverterInfo = TriangleConverterInfo(obj, None, fModel.f3d, finalTransform, getInfoDict(obj)) fMeshes = saveStaticModel( triConverterInfo, fModel, obj, finalTransform, fModel.name, not saveTextures, False, "oot" @@ -123,7 +121,7 @@ class OOT_ImportDL(Operator): paths = [ootGetObjectPath(isCustomImport, importPath, folderName)] data = getImportData(paths) - f3dContext = OOTF3DContext(F3D("F3DEX2/LX2", False), [name], basePath) + f3dContext = OOTF3DContext(get_F3D_GBI(), [name], basePath) scale = getOOTScale(settings.actorScale) if not isCustomImport: @@ -181,15 +179,11 @@ class OOT_ExportDL(Operator): # context.scene.geoLevelOption) saveTextures = context.scene.saveTextures - isHWv1 = context.scene.isHWv1 - f3dType = context.scene.f3d_type exportSettings = context.scene.fast64.oot.DLExportSettings ootConvertMeshToC( obj, finalTransform, - f3dType, - isHWv1, DLFormat.Static, saveTextures, exportSettings, diff --git a/fast64_internal/oot/oot_level_parser.py b/fast64_internal/oot/oot_level_parser.py index 887f090..a5e9784 100644 --- a/fast64_internal/oot/oot_level_parser.py +++ b/fast64_internal/oot/oot_level_parser.py @@ -3,7 +3,7 @@ from random import random from collections import OrderedDict from ..utility import PluginError, readFile, parentObject, hexOrDecInt, gammaInverse, yUpToZUp from ..f3d.f3d_parser import parseMatrices, importMeshC -from ..f3d.f3d_gbi import F3D +from ..f3d.f3d_gbi import F3D, get_F3D_GBI from ..f3d.flipbook import TextureFlipbook from .collision.properties import OOTMaterialCollisionProperty from .oot_model_classes import OOTF3DContext @@ -192,8 +192,6 @@ class SharedSceneData: def parseScene( - f3dType: str, - isHWv1: bool, settings: OOTImportSceneSettingsProperty, option: str, ): @@ -231,7 +229,7 @@ def parseScene( bpy.context.mode = "OBJECT" # set scene default registers (see sDefaultDisplayList) - f3dContext = OOTF3DContext(F3D(f3dType, isHWv1), [], bpy.path.abspath(bpy.context.scene.ootDecompPath)) + f3dContext = OOTF3DContext(get_F3D_GBI(), [], bpy.path.abspath(bpy.context.scene.ootDecompPath)) f3dContext.mat().prim_color = (0.5, 0.5, 0.5, 0.5) f3dContext.mat().env_color = (0.5, 0.5, 0.5, 0.5) diff --git a/fast64_internal/oot/oot_level_writer.py b/fast64_internal/oot/oot_level_writer.py index 33da8d6..96fc98a 100644 --- a/fast64_internal/oot/oot_level_writer.py +++ b/fast64_internal/oot/oot_level_writer.py @@ -105,13 +105,13 @@ def ootCombineSceneFiles(levelC): def ootExportSceneToC( - originalSceneObj, transformMatrix, f3dType, isHWv1, sceneName, DLFormat, savePNG, exportInfo, bootToSceneOptions + originalSceneObj, transformMatrix, sceneName, DLFormat, savePNG, exportInfo, bootToSceneOptions ): checkObjectReference(originalSceneObj, "Scene object") isCustomExport = exportInfo.isCustomExportPath exportPath = exportInfo.exportPath - scene = ootConvertScene(originalSceneObj, transformMatrix, f3dType, isHWv1, sceneName, DLFormat, not savePNG) + scene = ootConvertScene(originalSceneObj, transformMatrix, sceneName, DLFormat, not savePNG) exportSubdir = "" if exportInfo.customSubPath is not None: @@ -492,7 +492,7 @@ def readPathProp(pathProp, obj, scene, sceneObj, sceneName, transformMatrix): addActor(scene, ootConvertPath(sceneName, obj, relativeTransform), obj.ootSplineProperty, "pathList", obj.name) -def ootConvertScene(originalSceneObj, transformMatrix, f3dType, isHWv1, sceneName, DLFormat, convertTextureData): +def ootConvertScene(originalSceneObj, transformMatrix, sceneName, DLFormat, convertTextureData): if originalSceneObj.data is not None or originalSceneObj.ootEmptyType != "Scene": raise PluginError(originalSceneObj.name + ' is not an empty with the "Scene" empty type.') @@ -510,7 +510,7 @@ def ootConvertScene(originalSceneObj, transformMatrix, f3dType, isHWv1, sceneNam raise PluginError("The scene has no child empties with the 'Room' empty type.") try: - scene = OOTScene(sceneName, OOTModel(f3dType, isHWv1, sceneName + "_dl", DLFormat, None)) + scene = OOTScene(sceneName, OOTModel(sceneName + "_dl", DLFormat, None)) readSceneData(scene, sceneObj.fast64.oot.scene, sceneObj.ootSceneHeader, sceneObj.ootAlternateSceneHeaders) processedRooms = set() diff --git a/fast64_internal/oot/oot_model_classes.py b/fast64_internal/oot/oot_model_classes.py index cee3b87..5d0b778 100644 --- a/fast64_internal/oot/oot_model_classes.py +++ b/fast64_internal/oot/oot_model_classes.py @@ -95,11 +95,11 @@ def ootGetLinkData(basePath: str) -> str: class OOTModel(FModel): - def __init__(self, f3dType, isHWv1, name, DLFormat, drawLayerOverride): + def __init__(self, name, DLFormat, drawLayerOverride): self.drawLayerOverride = drawLayerOverride self.flipbooks: list[TextureFlipbook] = [] - FModel.__init__(self, f3dType, isHWv1, name, DLFormat, GfxMatWriteMethod.WriteAll) + FModel.__init__(self, name, DLFormat, GfxMatWriteMethod.WriteAll) # Since dynamic textures are handled by scene draw config, flipbooks should only belong to scene model. # Thus we have this function. diff --git a/fast64_internal/oot/scene/operators.py b/fast64_internal/oot/scene/operators.py index 0c28b72..abb8b43 100644 --- a/fast64_internal/oot/scene/operators.py +++ b/fast64_internal/oot/scene/operators.py @@ -37,14 +37,8 @@ def run_ops_without_view_layer_update(func): def parseSceneFunc(): - context = bpy.context - settings = context.scene.ootSceneImportSettings - parseScene( - context.scene.f3d_type, - context.scene.isHWv1, - settings, - settings.option, - ) + settings = bpy.context.scene.ootSceneImportSettings + parseScene(settings, settings.option) class OOT_SearchSceneEnumOperator(Operator): @@ -178,8 +172,6 @@ class OOT_ExportScene(Operator): ootExportSceneToC( obj, finalTransform, - context.scene.f3d_type, - context.scene.isHWv1, levelName, DLFormat.Static, context.scene.saveTextures, diff --git a/fast64_internal/oot/skeleton/exporter/functions.py b/fast64_internal/oot/skeleton/exporter/functions.py index 17b0268..1711134 100644 --- a/fast64_internal/oot/skeleton/exporter/functions.py +++ b/fast64_internal/oot/skeleton/exporter/functions.py @@ -210,8 +210,6 @@ def ootConvertArmatureToSkeletonWithMesh( def ootConvertArmatureToC( originalArmatureObj: bpy.types.Object, convertTransformMatrix: mathutils.Matrix, - f3dType: str, - isHWv1: bool, DLFormat: DLFormat, savePNG: bool, drawLayer: str, @@ -240,7 +238,7 @@ def ootConvertArmatureToC( removeVanillaData = settings.removeVanillaData optimize = settings.optimize - fModel = OOTModel(f3dType, isHWv1, skeletonName, DLFormat, drawLayer) + fModel = OOTModel(skeletonName, DLFormat, drawLayer) skeleton, fModel = ootConvertArmatureToSkeletonWithMesh( originalArmatureObj, convertTransformMatrix, fModel, skeletonName, not savePNG, drawLayer, optimize ) diff --git a/fast64_internal/oot/skeleton/importer/functions.py b/fast64_internal/oot/skeleton/importer/functions.py index bdf5484..04f25d0 100644 --- a/fast64_internal/oot/skeleton/importer/functions.py +++ b/fast64_internal/oot/skeleton/importer/functions.py @@ -1,5 +1,5 @@ import mathutils, bpy, math -from ....f3d.f3d_gbi import F3D +from ....f3d.f3d_gbi import F3D, get_F3D_GBI from ....f3d.f3d_parser import getImportData, parseF3D from ....utility import hexOrDecInt, applyRotation from ...oot_f3d_writer import ootReadActorScale @@ -233,7 +233,7 @@ def ootImportSkeletonC(basePath: str, importSettings: OOTSkeletonImportSettings) limbsData = matchResult.group(2) limbList = [entry.strip()[1:] for entry in limbsData.split(",") if entry.strip() != ""] - f3dContext = OOTF3DContext(F3D("F3DEX2/LX2", False), limbList, basePath) + f3dContext = OOTF3DContext(get_F3D_GBI(), limbList, basePath) f3dContext.mat().draw_layer.oot = drawLayer if overlayName is not None and importSettings.autoDetectActorScale: diff --git a/fast64_internal/oot/skeleton/operators.py b/fast64_internal/oot/skeleton/operators.py index bb4686a..372c93e 100644 --- a/fast64_internal/oot/skeleton/operators.py +++ b/fast64_internal/oot/skeleton/operators.py @@ -120,12 +120,10 @@ class OOT_ExportSkeleton(Operator): exportSettings: OOTSkeletonExportSettings = context.scene.fast64.oot.skeletonExportSettings saveTextures = context.scene.saveTextures - isHWv1 = context.scene.isHWv1 - f3dType = context.scene.f3d_type drawLayer = armatureObj.ootDrawLayer ootConvertArmatureToC( - armatureObj, finalTransform, f3dType, isHWv1, DLFormat.Static, saveTextures, drawLayer, exportSettings + armatureObj, finalTransform, DLFormat.Static, saveTextures, drawLayer, exportSettings ) self.report({"INFO"}, "Success!") diff --git a/fast64_internal/sm64/sm64_f3d_writer.py b/fast64_internal/sm64/sm64_f3d_writer.py index 8feaa89..8b3239c 100644 --- a/fast64_internal/sm64/sm64_f3d_writer.py +++ b/fast64_internal/sm64/sm64_f3d_writer.py @@ -98,8 +98,8 @@ enumHUDPaths = { class SM64Model(FModel): - def __init__(self, f3dType, isHWv1, name, DLFormat, matWriteMethod): - FModel.__init__(self, f3dType, isHWv1, name, DLFormat, matWriteMethod) + def __init__(self, name, DLFormat, matWriteMethod): + FModel.__init__(self, name, DLFormat, matWriteMethod) def getDrawLayerV3(self, obj): return int(obj.draw_layer_static) @@ -153,8 +153,8 @@ class SM64GfxFormatter(GfxFormatter): return data -def exportTexRectToC(dirPath, texProp, f3dType, isHWv1, texDir, savePNG, name, exportToProject, projectExportData): - fTexRect = exportTexRectCommon(texProp, f3dType, isHWv1, name, not savePNG) +def exportTexRectToC(dirPath, texProp, texDir, savePNG, name, exportToProject, projectExportData): + fTexRect = exportTexRectCommon(texProp, name, not savePNG) if name is None or name == "": raise PluginError("Name cannot be empty.") @@ -270,7 +270,7 @@ def modifyDLForHUD(data): return data -def exportTexRectCommon(texProp, f3dType, isHWv1, name, convertTextureData): +def exportTexRectCommon(texProp, name, convertTextureData): tex = texProp.tex if tex is None: raise PluginError("No texture is selected.") @@ -285,7 +285,7 @@ def exportTexRectCommon(texProp, f3dType, isHWv1, name, convertTextureData): texProp.T.mask = ceil(log(texProp.tex.size[1], 2) - 0.001) texProp.T.shift = 0 - fTexRect = FTexRect(f3dType, isHWv1, toAlnum(name), GfxMatWriteMethod.WriteDifferingAndRevert) + fTexRect = FTexRect(toAlnum(name), GfxMatWriteMethod.WriteDifferingAndRevert) fMaterial = FMaterial(toAlnum(name) + "_mat", DLFormat.Dynamic) # dl_hud_img_begin @@ -343,8 +343,6 @@ def sm64ExportF3DtoC( obj, DLFormat, transformMatrix, - f3dType, - isHWv1, texDir, savePNG, texSeparate, @@ -359,8 +357,6 @@ def sm64ExportF3DtoC( inline = bpy.context.scene.exportInlineF3D fModel = SM64Model( - f3dType, - isHWv1, name, DLFormat, GfxMatWriteMethod.WriteDifferingAndRevert if not inline else GfxMatWriteMethod.WriteAll, @@ -481,8 +477,8 @@ def sm64ExportF3DtoC( return fileStatus -def exportF3DtoBinary(romfile, exportRange, transformMatrix, obj, f3dType, isHWv1, segmentData, includeChildren): - fModel = SM64Model(f3dType, isHWv1, obj.name, DLFormat, GfxMatWriteMethod.WriteDifferingAndRevert) +def exportF3DtoBinary(romfile, exportRange, transformMatrix, obj, segmentData, includeChildren): + fModel = SM64Model(obj.name, DLFormat, GfxMatWriteMethod.WriteDifferingAndRevert) fMeshes = exportF3DCommon(obj, fModel, transformMatrix, includeChildren, obj.name, DLFormat.Static, True) fMesh = fMeshes[fModel.getDrawLayerV3(obj)] fModel.freePalettes() @@ -501,8 +497,8 @@ def exportF3DtoBinary(romfile, exportRange, transformMatrix, obj, f3dType, isHWv return fMesh.draw.startAddress, addrRange, segPointerData -def exportF3DtoBinaryBank0(romfile, exportRange, transformMatrix, obj, f3dType, isHWv1, RAMAddr, includeChildren): - fModel = SM64Model(f3dType, isHWv1, obj.name, DLFormat, GfxMatWriteMethod.WriteDifferingAndRevert) +def exportF3DtoBinaryBank0(romfile, exportRange, transformMatrix, obj, RAMAddr, includeChildren): + fModel = SM64Model(obj.name, DLFormat, GfxMatWriteMethod.WriteDifferingAndRevert) fMeshes = exportF3DCommon(obj, fModel, transformMatrix, includeChildren, obj.name, DLFormat.Static, True) fMesh = fMeshes[fModel.getDrawLayerV3(obj)] segmentData = copy.copy(bank0Segment) @@ -521,8 +517,8 @@ def exportF3DtoBinaryBank0(romfile, exportRange, transformMatrix, obj, f3dType, return (fMesh.draw.startAddress, (startAddress, startAddress + len(data)), segPointerData) -def exportF3DtoInsertableBinary(filepath, transformMatrix, obj, f3dType, isHWv1, includeChildren): - fModel = SM64Model(f3dType, isHWv1, obj.name, DLFormat, GfxMatWriteMethod.WriteDifferingAndRevert) +def exportF3DtoInsertableBinary(filepath, transformMatrix, obj, includeChildren): + fModel = SM64Model(obj.name, DLFormat, GfxMatWriteMethod.WriteDifferingAndRevert) fMeshes = exportF3DCommon(obj, fModel, transformMatrix, includeChildren, obj.name, DLFormat.Static, True) fMesh = fMeshes[fModel.getDrawLayerV3(obj)] @@ -603,8 +599,6 @@ class SM64_ExportDL(bpy.types.Operator): obj, DLFormat.Static if context.scene.DLExportisStatic else DLFormat.Dynamic, finalTransform, - context.scene.f3d_type, - context.scene.isHWv1, bpy.context.scene.DLTexDir, bpy.context.scene.saveTextures, bpy.context.scene.DLSeparateTextureDef, @@ -624,8 +618,6 @@ class SM64_ExportDL(bpy.types.Operator): bpy.path.abspath(context.scene.DLInsertableBinaryPath), finalTransform, obj, - context.scene.f3d_type, - context.scene.isHWv1, bpy.context.scene.DLincludeChildren, ) self.report({"INFO"}, "Success! DL at " + context.scene.DLInsertableBinaryPath + ".") @@ -648,8 +640,6 @@ class SM64_ExportDL(bpy.types.Operator): [int(context.scene.DLExportStart, 16), int(context.scene.DLExportEnd, 16)], finalTransform, obj, - context.scene.f3d_type, - context.scene.isHWv1, getAddressFromRAMAddress(int(context.scene.DLRAMAddr, 16)), bpy.context.scene.DLincludeChildren, ) @@ -659,8 +649,6 @@ class SM64_ExportDL(bpy.types.Operator): [int(context.scene.DLExportStart, 16), int(context.scene.DLExportEnd, 16)], finalTransform, obj, - context.scene.f3d_type, - context.scene.isHWv1, segmentData, bpy.context.scene.DLincludeChildren, ) @@ -796,8 +784,6 @@ class ExportTexRectDraw(bpy.types.Operator): exportTexRectToC( bpy.path.abspath(exportPath), context.scene.texrect, - context.scene.f3d_type, - context.scene.isHWv1, "textures/segment2", context.scene.saveTextures, context.scene.TexRectName, diff --git a/fast64_internal/sm64/sm64_geolayout_parser.py b/fast64_internal/sm64/sm64_geolayout_parser.py index 26ab1c0..d7cc46b 100644 --- a/fast64_internal/sm64/sm64_geolayout_parser.py +++ b/fast64_internal/sm64/sm64_geolayout_parser.py @@ -70,8 +70,6 @@ def parseGeoLayout( useArmature, ignoreSwitch, shadeSmooth, - f3dType, - isHWv1, ): currentAddress = startAddress romfile.seek(currentAddress) @@ -118,8 +116,6 @@ def parseGeoLayout( 0, 0, [None] * 16 * 16, - f3dType, - isHWv1, segmentData=segmentData, ) @@ -201,8 +197,6 @@ def parseNode( switchLevel, switchCount, vertexBuffer, - f3dType, - isHWv1, singleChild=False, endCmd=GEO_NODE_CLOSE, segmentData=None, @@ -296,8 +290,6 @@ def parseNode( switchLevel, switchCount, vertexBuffer, - f3dType, - isHWv1, singleChild=switchActive, segmentData=segmentData, ) @@ -346,8 +338,6 @@ def parseNode( nodeIndex[-1], segmentData, vertexBuffer, - f3dType, - isHWv1, ) elif currentCmd[0] == GEO_TRANSLATE: # 0x11 @@ -364,8 +354,6 @@ def parseNode( nodeIndex[-1], segmentData, vertexBuffer, - f3dType, - isHWv1, ) elif currentCmd[0] == GEO_ROTATE: # 0x12 @@ -382,8 +370,6 @@ def parseNode( nodeIndex[-1], segmentData, vertexBuffer, - f3dType, - isHWv1, ) elif currentCmd[0] == GEO_LOAD_DL_W_OFFSET: # 0x13 @@ -400,8 +386,6 @@ def parseNode( currentCmd, segmentData, vertexBuffer, - f3dType, - isHWv1, ) elif currentCmd[0] == GEO_BILLBOARD: # 0x14 @@ -418,8 +402,6 @@ def parseNode( nodeIndex[-1], segmentData, vertexBuffer, - f3dType, - isHWv1, ) elif currentCmd[0] == GEO_LOAD_DL: # 0x15 @@ -436,8 +418,6 @@ def parseNode( nodeIndex[-1], segmentData, vertexBuffer, - f3dType, - isHWv1, ) elif currentCmd[0] == GEO_START_W_SHADOW: # 0x16 @@ -490,8 +470,6 @@ def parseNode( nodeIndex[-1], segmentData, vertexBuffer, - f3dType, - isHWv1, ) elif currentCmd[0] == GEO_START_W_RENDERAREA: # 0x20 @@ -817,8 +795,6 @@ def parseDL( nodeIndex, segmentData, vertexBuffer, - f3dType, - isHWv1, ): drawLayer = bitMask(currentCmd[1], 0, 4) @@ -841,8 +817,6 @@ def parseDL( nodeIndex, "DisplayList", vertexBuffer, - f3dType, - isHWv1, ) if armatureObj is not None: bone = armatureObj.data.bones[boneName] @@ -865,8 +839,6 @@ def parseDLWithOffset( currentCmd, segmentData, vertexBuffer, - f3dType, - isHWv1, ): print("DL_OFFSET " + hex(currentAddress)) romfile.seek(currentAddress) @@ -968,8 +940,6 @@ def handleNodeCommon( nodeIndex, boneGroupName, vertexBuffer, - f3dType, - isHWv1, ): boneName = format(nodeIndex, "03") + "-" + boneGroupName.lower() @@ -1012,8 +982,6 @@ def parseScale( nodeIndex, segmentData, vertexBuffer, - f3dType, - isHWv1, ): print("SCALE " + hex(currentAddress)) @@ -1042,8 +1010,6 @@ def parseScale( nodeIndex, "Scale", vertexBuffer, - f3dType, - isHWv1, ) if armatureObj is not None: bone = armatureObj.data.bones[boneName] @@ -1069,8 +1035,6 @@ def parseTranslateRotate( nodeIndex, segmentData, vertexBuffer, - f3dType, - isHWv1, ): print("TRANSLATE_ROTATE " + hex(currentAddress)) @@ -1127,8 +1091,6 @@ def parseTranslateRotate( nodeIndex, "TranslateRotate", vertexBuffer, - f3dType, - isHWv1, ) if armatureObj is not None: bone = armatureObj.data.bones[boneName] @@ -1159,8 +1121,6 @@ def parseTranslate( nodeIndex, segmentData, vertexBuffer, - f3dType, - isHWv1, ): print("TRANSLATE " + hex(currentAddress)) @@ -1193,8 +1153,6 @@ def parseTranslate( nodeIndex, "Translate", vertexBuffer, - f3dType, - isHWv1, ) if armatureObj is not None: bone = armatureObj.data.bones[boneName] @@ -1220,8 +1178,6 @@ def parseRotate( nodeIndex, segmentData, vertexBuffer, - f3dType, - isHWv1, ): print("ROTATE " + hex(currentAddress)) @@ -1254,8 +1210,6 @@ def parseRotate( nodeIndex, "Rotate", vertexBuffer, - f3dType, - isHWv1, ) if armatureObj is not None: bone = armatureObj.data.bones[boneName] @@ -1280,8 +1234,6 @@ def parseBillboard( nodeIndex, segmentData, vertexBuffer, - f3dType, - isHWv1, ): print("BILLBOARD " + hex(currentAddress)) @@ -1314,8 +1266,6 @@ def parseBillboard( nodeIndex, "Billboard", vertexBuffer, - f3dType, - isHWv1, ) if armatureObj is not None: bone = armatureObj.data.bones[boneName] @@ -1558,8 +1508,6 @@ class SM64_ImportGeolayout(bpy.types.Operator): generateArmature, ignoreSwitch, True, - context.scene.f3d_type, - context.scene.isHWv1, ) romfileSrc.close() diff --git a/fast64_internal/sm64/sm64_geolayout_writer.py b/fast64_internal/sm64/sm64_geolayout_writer.py index 2811db9..d30ffb1 100644 --- a/fast64_internal/sm64/sm64_geolayout_writer.py +++ b/fast64_internal/sm64/sm64_geolayout_writer.py @@ -354,13 +354,11 @@ def appendRevertToGeolayout(geolayoutGraph, fModel): # Convert to Geolayout def convertArmatureToGeolayout( - armatureObj, obj, convertTransformMatrix, f3dType, isHWv1, camera, name, DLFormat, convertTextureData + armatureObj, obj, convertTransformMatrix, camera, name, DLFormat, convertTextureData ): inline = bpy.context.scene.exportInlineF3D fModel = SM64Model( - f3dType, - isHWv1, name, DLFormat, GfxMatWriteMethod.WriteDifferingAndRevert if not inline else GfxMatWriteMethod.WriteAll, @@ -424,14 +422,12 @@ def convertArmatureToGeolayout( # Camera is unused here def convertObjectToGeolayout( - obj, convertTransformMatrix, f3dType, isHWv1, camera, name, fModel: FModel, areaObj, DLFormat, convertTextureData + obj, convertTransformMatrix, camera, name, fModel: FModel, areaObj, DLFormat, convertTextureData ): inline = bpy.context.scene.exportInlineF3D if fModel is None: fModel = SM64Model( - f3dType, - isHWv1, name, DLFormat, GfxMatWriteMethod.WriteDifferingAndRevert if not inline else GfxMatWriteMethod.WriteAll, @@ -501,8 +497,6 @@ def exportGeolayoutArmatureC( armatureObj, obj, convertTransformMatrix, - f3dType, - isHWv1, dirPath, texDir, savePNG, @@ -517,7 +511,7 @@ def exportGeolayoutArmatureC( DLFormat, ): geolayoutGraph, fModel = convertArmatureToGeolayout( - armatureObj, obj, convertTransformMatrix, f3dType, isHWv1, camera, dirName, DLFormat, not savePNG + armatureObj, obj, convertTransformMatrix, camera, dirName, DLFormat, not savePNG ) return saveGeolayoutC( @@ -540,8 +534,6 @@ def exportGeolayoutArmatureC( def exportGeolayoutObjectC( obj, convertTransformMatrix, - f3dType, - isHWv1, dirPath, texDir, savePNG, @@ -556,7 +548,7 @@ def exportGeolayoutObjectC( DLFormat, ): geolayoutGraph, fModel = convertObjectToGeolayout( - obj, convertTransformMatrix, f3dType, isHWv1, camera, dirName, None, None, DLFormat, not savePNG + obj, convertTransformMatrix, camera, dirName, None, None, DLFormat, not savePNG ) return saveGeolayoutC( @@ -810,18 +802,18 @@ def saveGeolayoutC( # Insertable Binary def exportGeolayoutArmatureInsertableBinary( - armatureObj, obj, convertTransformMatrix, f3dType, isHWv1, filepath, camera + armatureObj, obj, convertTransformMatrix, filepath, camera ): geolayoutGraph, fModel = convertArmatureToGeolayout( - armatureObj, obj, convertTransformMatrix, f3dType, isHWv1, camera, armatureObj.name, DLFormat.Static, True + armatureObj, obj, convertTransformMatrix, camera, armatureObj.name, DLFormat.Static, True ) saveGeolayoutInsertableBinary(geolayoutGraph, fModel, filepath, f3dType) -def exportGeolayoutObjectInsertableBinary(obj, convertTransformMatrix, f3dType, isHWv1, filepath, camera): +def exportGeolayoutObjectInsertableBinary(obj, convertTransformMatrix, filepath, camera): geolayoutGraph, fModel = convertObjectToGeolayout( - obj, convertTransformMatrix, f3dType, isHWv1, camera, obj.name, None, None, DLFormat.Static, True + obj, convertTransformMatrix, camera, obj.name, None, None, DLFormat.Static, True ) saveGeolayoutInsertableBinary(geolayoutGraph, fModel, filepath, f3dType) @@ -848,14 +840,12 @@ def exportGeolayoutArmatureBinaryBank0( levelCommandPos, modelID, textDumpFilePath, - f3dType, - isHWv1, RAMAddr, camera, ): geolayoutGraph, fModel = convertArmatureToGeolayout( - armatureObj, obj, convertTransformMatrix, f3dType, isHWv1, camera, armatureObj.name, DLFormat.Static, True + armatureObj, obj, convertTransformMatrix, camera, armatureObj.name, DLFormat.Static, True ) return saveGeolayoutBinaryBank0( @@ -871,14 +861,12 @@ def exportGeolayoutObjectBinaryBank0( levelCommandPos, modelID, textDumpFilePath, - f3dType, - isHWv1, RAMAddr, camera, ): geolayoutGraph, fModel = convertObjectToGeolayout( - obj, convertTransformMatrix, f3dType, isHWv1, camera, obj.name, None, None, DLFormat.Static, True + obj, convertTransformMatrix, camera, obj.name, None, None, DLFormat.Static, True ) return saveGeolayoutBinaryBank0( @@ -938,13 +926,11 @@ def exportGeolayoutArmatureBinary( levelCommandPos, modelID, textDumpFilePath, - f3dType, - isHWv1, camera, ): geolayoutGraph, fModel = convertArmatureToGeolayout( - armatureObj, obj, convertTransformMatrix, f3dType, isHWv1, camera, armatureObj.name, DLFormat.Static, True + armatureObj, obj, convertTransformMatrix, camera, armatureObj.name, DLFormat.Static, True ) return saveGeolayoutBinary( @@ -961,13 +947,11 @@ def exportGeolayoutObjectBinary( levelCommandPos, modelID, textDumpFilePath, - f3dType, - isHWv1, camera, ): geolayoutGraph, fModel = convertObjectToGeolayout( - obj, convertTransformMatrix, f3dType, isHWv1, camera, obj.name, None, None, DLFormat.Static, True + obj, convertTransformMatrix, camera, obj.name, None, None, DLFormat.Static, True ) return saveGeolayoutBinary( @@ -2887,8 +2871,6 @@ class SM64_ExportGeolayoutObject(ObjectDataExporter): exportGeolayoutObjectC( obj, finalTransform, - context.scene.f3d_type, - context.scene.isHWv1, exportPath, bpy.context.scene.geoTexDir, saveTextures, @@ -2907,8 +2889,6 @@ class SM64_ExportGeolayoutObject(ObjectDataExporter): exportGeolayoutObjectInsertableBinary( obj, finalTransform, - context.scene.f3d_type, - context.scene.isHWv1, bpy.path.abspath(bpy.context.scene.geoInsertableBinaryPath), None, ) @@ -2944,8 +2924,6 @@ class SM64_ExportGeolayoutObject(ObjectDataExporter): finalTransform, *modelLoadInfo, textDumpFilePath, - context.scene.f3d_type, - context.scene.isHWv1, getAddressFromRAMAddress(int(context.scene.geoRAMAddr, 16)), None, ) @@ -2958,8 +2936,6 @@ class SM64_ExportGeolayoutObject(ObjectDataExporter): segmentData, *modelLoadInfo, textDumpFilePath, - context.scene.f3d_type, - context.scene.isHWv1, None, ) @@ -3098,8 +3074,6 @@ class SM64_ExportGeolayoutArmature(bpy.types.Operator): armatureObj, obj, finalTransform, - context.scene.f3d_type, - context.scene.isHWv1, exportPath, bpy.context.scene.geoTexDir, saveTextures, @@ -3120,8 +3094,6 @@ class SM64_ExportGeolayoutArmature(bpy.types.Operator): armatureObj, obj, finalTransform, - context.scene.f3d_type, - context.scene.isHWv1, bpy.path.abspath(bpy.context.scene.geoInsertableBinaryPath), None, ) @@ -3158,8 +3130,6 @@ class SM64_ExportGeolayoutArmature(bpy.types.Operator): finalTransform, *modelLoadInfo, textDumpFilePath, - context.scene.f3d_type, - context.scene.isHWv1, getAddressFromRAMAddress(int(context.scene.geoRAMAddr, 16)), None, ) @@ -3173,8 +3143,6 @@ class SM64_ExportGeolayoutArmature(bpy.types.Operator): segmentData, *modelLoadInfo, textDumpFilePath, - context.scene.f3d_type, - context.scene.isHWv1, None, ) diff --git a/fast64_internal/sm64/sm64_level_writer.py b/fast64_internal/sm64/sm64_level_writer.py index 0e5e2cc..78099f8 100644 --- a/fast64_internal/sm64/sm64_level_writer.py +++ b/fast64_internal/sm64/sm64_level_writer.py @@ -698,7 +698,7 @@ class SM64OptionalFileStatus: def exportLevelC( - obj, transformMatrix, f3dType, isHWv1, levelName, exportDir, savePNG, customExport, levelCameraVolumeName, DLFormat + obj, transformMatrix, levelName, exportDir, savePNG, customExport, levelCameraVolumeName, DLFormat ): fileStatus = SM64OptionalFileStatus() @@ -725,7 +725,7 @@ def exportLevelC( puppycamVolumeString = "" inline = bpy.context.scene.exportInlineF3D - fModel = SM64Model(f3dType, isHWv1, levelName + "_dl", DLFormat, GfxMatWriteMethod.WriteDifferingAndRevert if not inline else GfxMatWriteMethod.WriteAll) + fModel = SM64Model(levelName + "_dl", DLFormat, GfxMatWriteMethod.WriteDifferingAndRevert if not inline else GfxMatWriteMethod.WriteAll) childAreas = [child for child in obj.children if child.data is None and child.sm64_obj_type == "Area Root"] if len(childAreas) == 0: raise PluginError("The level root has no child empties with the 'Area Root' object type.") @@ -767,8 +767,6 @@ def exportLevelC( geolayoutGraph, fModel = convertObjectToGeolayout( obj, transformMatrix, - f3dType, - isHWv1, child.areaCamera, levelName + "_" + areaName, fModel, @@ -1181,8 +1179,6 @@ class SM64_ExportLevel(ObjectDataExporter): fileStatus = exportLevelC( obj, finalTransform, - context.scene.f3d_type, - context.scene.isHWv1, levelName, exportPath, context.scene.saveTextures, From 23f03ed6ea8ea6a97927102ba37af73639ca593f Mon Sep 17 00:00:00 2001 From: Sauraen Date: Fri, 13 Oct 2023 22:44:42 -0700 Subject: [PATCH 22/74] Fixing bugs in F3DEX3 import --- fast64_internal/f3d/f3d_gbi.py | 3 +-- fast64_internal/f3d/f3d_parser.py | 14 +++++--------- fast64_internal/f3d/f3d_writer.py | 2 +- fast64_internal/utility.py | 6 +++--- 4 files changed, 10 insertions(+), 15 deletions(-) diff --git a/fast64_internal/f3d/f3d_gbi.py b/fast64_internal/f3d/f3d_gbi.py index 0121997..6da456a 100644 --- a/fast64_internal/f3d/f3d_gbi.py +++ b/fast64_internal/f3d/f3d_gbi.py @@ -2085,7 +2085,7 @@ class Vtx: def spc(x): return "{" + ", ".join([str(a) for a in x]) + "}" - flag = "0" if self.packedNormal == 0 else hex(self.packedNormal) + flag = "0" if self.packedNormal == 0 else "{0:#06x}".format(self.packedNormal) return "{{ " + ", ".join([spc(self.position), flag, spc(self.uv), spc(self.colorOrNormal)]) + " }}" @@ -3375,7 +3375,6 @@ class GbiMacro: return " | ".join(field) if len(field) else "0" if self._hex > 0 and isinstance(field, int): temp = field if field >= 0 else (1 << (self._hex * 4)) + field - print(f"{temp}, {self._hex}") return "{0:#0{1}x}".format(temp, self._hex + 2) # + 2 for the 0x part return str(field) diff --git a/fast64_internal/f3d/f3d_parser.py b/fast64_internal/f3d/f3d_parser.py index 8dc5614..72ab488 100644 --- a/fast64_internal/f3d/f3d_parser.py +++ b/fast64_internal/f3d/f3d_parser.py @@ -453,8 +453,6 @@ class F3DParsedCommands: class F3DContext: def __init__(self, f3d: F3D, basePath: str, materialContext: bpy.types.Material): self.f3d: F3D = f3d - if not self.f3d.F3DEX_GBI_3: - print("\n\nF3D at creation of F3DContext is not F3DEX3!\n\n") self.basePath: str = basePath self.materialContext: bpy.types.Material = materialContext self.materialContext.f3d_update_flag = True # Don't want visual updates while parsing @@ -874,8 +872,6 @@ class F3DContext: mat = self.mat() bitFlags = math_eval(command.params[0], self.f3d) - assert self.f3d.F3DEX_GBI_3 - if bitFlags & self.f3d.G_ZBUFFER: mat.rdp_settings.g_zbuffer = value if bitFlags & self.f3d.G_SHADE: @@ -1574,12 +1570,12 @@ class F3DContext: elif command.name[:13] == "gsSPSetLights": self.setLights(dlData, command) elif command.name == "gsSPAmbOcclusion": - mat.ao_ambient = float(int(command.params[0])) / (2**16) - mat.ao_directional = float(int(command.params[1])) / (2**16) + mat.ao_ambient = float(int(command.params[0], 0)) / (2**16) + mat.ao_directional = float(int(command.params[1], 0)) / (2**16) mat.set_ao = True elif command.name == "gsSPFresnel": - offset = min(float(int(command.params[0])) / (2**15), 1.0) - scale = int(command.params[1]) + offset = min(float(int(command.params[0], 0)) / (2**15), 1.0) + scale = int(command.params[1], 0) scaleInt = scale - 0x10000 if scale >= 0x8000 else scale scale = float(scaleInt) / (2**8) mat.fresnel_lo = offset @@ -1964,7 +1960,7 @@ def parseVertexData(dlData: str, vertexDataName: str, f3dContext: F3DContext): math_eval(match.group(9), f3d), ] ), - unpackNormal(match.group(4)), + unpackNormal(math_eval(match.group(4), f3d)), math_eval(match.group(10), f3d), ) for match in re.finditer(pattern, data, re.DOTALL) diff --git a/fast64_internal/f3d/f3d_writer.py b/fast64_internal/f3d/f3d_writer.py index 2f3cc25..a85444b 100644 --- a/fast64_internal/f3d/f3d_writer.py +++ b/fast64_internal/f3d/f3d_writer.py @@ -954,7 +954,7 @@ def getF3DVert(loop: bpy.types.MeshLoop, face, convertInfo: LoopConvertInfo, mes uv[1] = 1 - uv[1] uv = uv.freeze() - has_rgb, has_normal, _ = getRgbNormalSettings(convertInfo.material) + has_rgb, has_normal, _ = getRgbNormalSettings(convertInfo.material.f3d_mat) mesh = convertInfo.obj.data color = getLoopColor(loop, mesh) rgb = color[:3] if has_rgb else None diff --git a/fast64_internal/utility.py b/fast64_internal/utility.py index 1f437de..30766b3 100644 --- a/fast64_internal/utility.py +++ b/fast64_internal/utility.py @@ -608,7 +608,7 @@ def from_s16(value: int): def from_s16_str(value: str): - return from_s16(int(value)) + return from_s16(int(value, 0)) def decompFolderMessage(layout): @@ -1478,8 +1478,8 @@ def packNormal(normal): return packedNormal -def getRgbNormalSettings(material): - rdp_settings = material.f3d_mat.rdp_settings +def getRgbNormalSettings(f3d_mat): + rdp_settings = f3d_mat.rdp_settings has_packed_normals = bpy.context.scene.f3d_type == "F3DEX3" has_rgb = not rdp_settings.g_lighting or (has_packed_normals and rdp_settings.g_packed_normals) has_normal = rdp_settings.g_lighting From 94c1bd67b02660b54cdd1b3d4b3834809b518422 Mon Sep 17 00:00:00 2001 From: Sauraen Date: Sat, 14 Oct 2023 16:47:42 -0700 Subject: [PATCH 23/74] Fixed bugs in F3DEX3 import --- fast64_internal/f3d/f3d_gbi.py | 2 ++ fast64_internal/f3d/f3d_parser.py | 6 ++-- fast64_internal/f3d/f3d_writer.py | 50 +++++++++---------------------- 3 files changed, 19 insertions(+), 39 deletions(-) diff --git a/fast64_internal/f3d/f3d_gbi.py b/fast64_internal/f3d/f3d_gbi.py index 6da456a..b8668e2 100644 --- a/fast64_internal/f3d/f3d_gbi.py +++ b/fast64_internal/f3d/f3d_gbi.py @@ -152,6 +152,8 @@ class F3D: self.F3D_VER = F3D_VER # self._LANGUAGE_ASSEMBLY = _LANGUAGE_ASSEMBLY + self.HAS_TRI2 = F3DEX_GBI or F3DEX_GBI_2 or F3DEX_GBI_3 + if F3DEX_GBI_2: self.G_NOOP = 0x00 self.G_RDPHALF_2 = 0xF1 diff --git a/fast64_internal/f3d/f3d_parser.py b/fast64_internal/f3d/f3d_parser.py index 72ab488..2b9977b 100644 --- a/fast64_internal/f3d/f3d_parser.py +++ b/fast64_internal/f3d/f3d_parser.py @@ -665,7 +665,7 @@ class F3DContext: normal = f3dVert.normal else: normal = mathutils.Vector([v - 0x100 if v >= 0x80 else v for v in f3dVert.rgb]).normalized() - normal = (transform.inverse().transposed() @ normal).normalized() + normal = (transform.inverted().transposed() @ normal).normalized() # NOTE: The groupIndex here does NOT correspond to a vertex group, but to the name of the limb (c variable) return BufferVertex(F3DVert(position, uv, rgb, normal, alpha), bufferVert.groupIndex, bufferVert.materialIndex) @@ -1820,11 +1820,11 @@ class F3DContext: color_layer = mesh.vertex_colors.new(name="Col").data for i in range(len(mesh.loops)): # if self.materialContext.f3d_mat.rdp_settings.g_lighting: - color_layer[i].color = self.verts[i].color + color_layer[i].color = self.verts[i].rgb.to_4d() alpha_layer = mesh.vertex_colors.new(name="Alpha").data for i in range(len(mesh.loops)): - alpha_layer[i].color = [self.verts[i].color[3]] * 3 + [1] + alpha_layer[i].color = [self.verts[i].alpha] * 3 + [1] if bpy.context.mode != "OBJECT": bpy.ops.object.mode_set(mode="OBJECT") diff --git a/fast64_internal/f3d/f3d_writer.py b/fast64_internal/f3d/f3d_writer.py index a85444b..2154e32 100644 --- a/fast64_internal/f3d/f3d_writer.py +++ b/fast64_internal/f3d/f3d_writer.py @@ -900,7 +900,7 @@ class TriangleConverter: # Load triangles self.triList.commands.extend( - createTriangleCommands(self.vertexBufferTriangles, self.vertBuffer, self.triConverterInfo.f3d.F3DEX_GBI) + createTriangleCommands(self.vertexBufferTriangles, self.vertBuffer, self.triConverterInfo.f3d.HAS_TRI2) ) def addFace(self, face, stOffset): @@ -1008,43 +1008,21 @@ def getLoopColor(loop: bpy.types.MeshLoop, mesh): def createTriangleCommands(triangles, vertexBuffer, useSP2Triangle): triangles = copy.deepcopy(triangles) commands = [] - if useSP2Triangle: - while len(triangles) > 0: - if len(triangles) >= 2: - commands.append( - SP2Triangles( - vertexBuffer.index(triangles[0][0]), - vertexBuffer.index(triangles[0][1]), - vertexBuffer.index(triangles[0][2]), - 0, - vertexBuffer.index(triangles[1][0]), - vertexBuffer.index(triangles[1][1]), - vertexBuffer.index(triangles[1][2]), - 0, - ) - ) - triangles = triangles[2:] - else: - commands.append( - SP1Triangle( - vertexBuffer.index(triangles[0][0]), - vertexBuffer.index(triangles[0][1]), - vertexBuffer.index(triangles[0][2]), - 0, - ) - ) - triangles = [] - else: - while len(triangles) > 0: + + def getIndices(tri): + return [vertexBuffer.index(v) for v in tri] + + t = 0 + while t < len(triangles): + firstTriIndices = getIndices(triangles[t]) + t += 1 + if useSP2Triangle and t < len(triangles): commands.append( - SP1Triangle( - vertexBuffer.index(triangles[0][0]), - vertexBuffer.index(triangles[0][1]), - vertexBuffer.index(triangles[0][2]), - 0, - ) + SP2Triangles(*firstTriIndices, 0, *getIndices(triangles[t]), 0) ) - triangles = triangles[1:] + t += 1 + else: + commands.append(SP1Triangle(*firstTriIndices, 0)) return commands From 8358194779afa1e262bc3946648e39de16a2f09e Mon Sep 17 00:00:00 2001 From: Sauraen Date: Sat, 14 Oct 2023 17:39:24 -0700 Subject: [PATCH 24/74] Fixed presets --- fast64_internal/f3d/f3d_material_presets.py | 155 ++++++++++++-------- 1 file changed, 93 insertions(+), 62 deletions(-) diff --git a/fast64_internal/f3d/f3d_material_presets.py b/fast64_internal/f3d/f3d_material_presets.py index 20794e5..30a1d22 100644 --- a/fast64_internal/f3d/f3d_material_presets.py +++ b/fast64_internal/f3d/f3d_material_presets.py @@ -57,9 +57,10 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None -f3d_mat.ao_ambient = 1.0 -f3d_mat.ao_directional = 0.625 f3d_mat.set_ao = False +f3d_mat.set_fresnel = False +f3d_mat.set_attroffs_st = False +f3d_mat.set_attroffs_z = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False @@ -185,9 +186,10 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None -f3d_mat.ao_ambient = 1.0 -f3d_mat.ao_directional = 0.625 f3d_mat.set_ao = False +f3d_mat.set_fresnel = False +f3d_mat.set_attroffs_st = False +f3d_mat.set_attroffs_z = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False @@ -313,9 +315,10 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None -f3d_mat.ao_ambient = 1.0 -f3d_mat.ao_directional = 0.625 f3d_mat.set_ao = False +f3d_mat.set_fresnel = False +f3d_mat.set_attroffs_st = False +f3d_mat.set_attroffs_z = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False @@ -441,9 +444,10 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None -f3d_mat.ao_ambient = 1.0 -f3d_mat.ao_directional = 0.625 f3d_mat.set_ao = False +f3d_mat.set_fresnel = False +f3d_mat.set_attroffs_st = False +f3d_mat.set_attroffs_z = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False @@ -569,9 +573,10 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None -f3d_mat.ao_ambient = 1.0 -f3d_mat.ao_directional = 0.625 f3d_mat.set_ao = False +f3d_mat.set_fresnel = False +f3d_mat.set_attroffs_st = False +f3d_mat.set_attroffs_z = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False @@ -697,9 +702,10 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None -f3d_mat.ao_ambient = 1.0 -f3d_mat.ao_directional = 0.625 f3d_mat.set_ao = False +f3d_mat.set_fresnel = False +f3d_mat.set_attroffs_st = False +f3d_mat.set_attroffs_z = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False @@ -825,9 +831,10 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None -f3d_mat.ao_ambient = 1.0 -f3d_mat.ao_directional = 0.625 f3d_mat.set_ao = False +f3d_mat.set_fresnel = False +f3d_mat.set_attroffs_st = False +f3d_mat.set_attroffs_z = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False @@ -953,9 +960,10 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None -f3d_mat.ao_ambient = 1.0 -f3d_mat.ao_directional = 0.625 f3d_mat.set_ao = False +f3d_mat.set_fresnel = False +f3d_mat.set_attroffs_st = False +f3d_mat.set_attroffs_z = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False @@ -1081,9 +1089,10 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None -f3d_mat.ao_ambient = 1.0 -f3d_mat.ao_directional = 0.625 f3d_mat.set_ao = False +f3d_mat.set_fresnel = False +f3d_mat.set_attroffs_st = False +f3d_mat.set_attroffs_z = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False @@ -1209,9 +1218,10 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None -f3d_mat.ao_ambient = 1.0 -f3d_mat.ao_directional = 0.625 f3d_mat.set_ao = False +f3d_mat.set_fresnel = False +f3d_mat.set_attroffs_st = False +f3d_mat.set_attroffs_z = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False @@ -1337,9 +1347,10 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None -f3d_mat.ao_ambient = 1.0 -f3d_mat.ao_directional = 0.625 f3d_mat.set_ao = False +f3d_mat.set_fresnel = False +f3d_mat.set_attroffs_st = False +f3d_mat.set_attroffs_z = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False @@ -1465,9 +1476,10 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None -f3d_mat.ao_ambient = 1.0 -f3d_mat.ao_directional = 0.625 f3d_mat.set_ao = False +f3d_mat.set_fresnel = False +f3d_mat.set_attroffs_st = False +f3d_mat.set_attroffs_z = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False @@ -1593,9 +1605,10 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None -f3d_mat.ao_ambient = 1.0 -f3d_mat.ao_directional = 0.625 f3d_mat.set_ao = False +f3d_mat.set_fresnel = False +f3d_mat.set_attroffs_st = False +f3d_mat.set_attroffs_z = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False @@ -1721,9 +1734,10 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None -f3d_mat.ao_ambient = 1.0 -f3d_mat.ao_directional = 0.625 f3d_mat.set_ao = False +f3d_mat.set_fresnel = False +f3d_mat.set_attroffs_st = False +f3d_mat.set_attroffs_z = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False @@ -1849,9 +1863,10 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None -f3d_mat.ao_ambient = 1.0 -f3d_mat.ao_directional = 0.625 f3d_mat.set_ao = False +f3d_mat.set_fresnel = False +f3d_mat.set_attroffs_st = False +f3d_mat.set_attroffs_z = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False @@ -1977,9 +1992,10 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None -f3d_mat.ao_ambient = 1.0 -f3d_mat.ao_directional = 0.625 f3d_mat.set_ao = False +f3d_mat.set_fresnel = False +f3d_mat.set_attroffs_st = False +f3d_mat.set_attroffs_z = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False @@ -2104,9 +2120,10 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None -f3d_mat.ao_ambient = 1.0 -f3d_mat.ao_directional = 0.625 f3d_mat.set_ao = False +f3d_mat.set_fresnel = False +f3d_mat.set_attroffs_st = False +f3d_mat.set_attroffs_z = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False @@ -2231,9 +2248,10 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None -f3d_mat.ao_ambient = 1.0 -f3d_mat.ao_directional = 0.625 f3d_mat.set_ao = False +f3d_mat.set_fresnel = False +f3d_mat.set_attroffs_st = False +f3d_mat.set_attroffs_z = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = True @@ -2358,9 +2376,10 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None -f3d_mat.ao_ambient = 1.0 -f3d_mat.ao_directional = 0.625 f3d_mat.set_ao = False +f3d_mat.set_fresnel = False +f3d_mat.set_attroffs_st = False +f3d_mat.set_attroffs_z = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = True @@ -2485,9 +2504,10 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None -f3d_mat.ao_ambient = 1.0 -f3d_mat.ao_directional = 0.625 f3d_mat.set_ao = False +f3d_mat.set_fresnel = False +f3d_mat.set_attroffs_st = False +f3d_mat.set_attroffs_z = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = True @@ -2612,9 +2632,10 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None -f3d_mat.ao_ambient = 1.0 -f3d_mat.ao_directional = 0.625 f3d_mat.set_ao = False +f3d_mat.set_fresnel = False +f3d_mat.set_attroffs_st = False +f3d_mat.set_attroffs_z = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False @@ -2739,9 +2760,10 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None -f3d_mat.ao_ambient = 1.0 -f3d_mat.ao_directional = 0.625 f3d_mat.set_ao = False +f3d_mat.set_fresnel = False +f3d_mat.set_attroffs_st = False +f3d_mat.set_attroffs_z = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False @@ -2866,9 +2888,10 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None -f3d_mat.ao_ambient = 1.0 -f3d_mat.ao_directional = 0.625 f3d_mat.set_ao = False +f3d_mat.set_fresnel = False +f3d_mat.set_attroffs_st = False +f3d_mat.set_attroffs_z = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False @@ -2993,9 +3016,10 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None -f3d_mat.ao_ambient = 1.0 -f3d_mat.ao_directional = 0.625 f3d_mat.set_ao = False +f3d_mat.set_fresnel = False +f3d_mat.set_attroffs_st = False +f3d_mat.set_attroffs_z = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False @@ -3120,9 +3144,10 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None -f3d_mat.ao_ambient = 1.0 -f3d_mat.ao_directional = 0.625 f3d_mat.set_ao = False +f3d_mat.set_fresnel = False +f3d_mat.set_attroffs_st = False +f3d_mat.set_attroffs_z = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False @@ -3247,9 +3272,10 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None -f3d_mat.ao_ambient = 1.0 -f3d_mat.ao_directional = 0.625 f3d_mat.set_ao = False +f3d_mat.set_fresnel = False +f3d_mat.set_attroffs_st = False +f3d_mat.set_attroffs_z = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False @@ -3374,9 +3400,10 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None -f3d_mat.ao_ambient = 1.0 -f3d_mat.ao_directional = 0.625 f3d_mat.set_ao = False +f3d_mat.set_fresnel = False +f3d_mat.set_attroffs_st = False +f3d_mat.set_attroffs_z = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False @@ -3501,9 +3528,10 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None -f3d_mat.ao_ambient = 1.0 -f3d_mat.ao_directional = 0.625 f3d_mat.set_ao = False +f3d_mat.set_fresnel = False +f3d_mat.set_attroffs_st = False +f3d_mat.set_attroffs_z = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False @@ -3628,9 +3656,10 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None -f3d_mat.ao_ambient = 1.0 -f3d_mat.ao_directional = 0.625 f3d_mat.set_ao = False +f3d_mat.set_fresnel = False +f3d_mat.set_attroffs_st = False +f3d_mat.set_attroffs_z = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False @@ -3756,9 +3785,10 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None -f3d_mat.ao_ambient = 1.0 -f3d_mat.ao_directional = 0.625 f3d_mat.set_ao = False +f3d_mat.set_fresnel = False +f3d_mat.set_attroffs_st = False +f3d_mat.set_attroffs_z = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False @@ -3885,9 +3915,10 @@ f3d_mat.f3d_light4 = None f3d_mat.f3d_light5 = None f3d_mat.f3d_light6 = None f3d_mat.f3d_light7 = None -f3d_mat.ao_ambient = 1.0 -f3d_mat.ao_directional = 0.625 f3d_mat.set_ao = False +f3d_mat.set_fresnel = False +f3d_mat.set_attroffs_st = False +f3d_mat.set_attroffs_z = False f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) f3d_mat.fog_position = (985, 1000) f3d_mat.set_fog = False From f7b0c4436c3d4e22a1eb2e663adb364433f86164 Mon Sep 17 00:00:00 2001 From: Sauraen Date: Sat, 14 Oct 2023 17:44:55 -0700 Subject: [PATCH 25/74] blacked --- fast64_internal/f3d/f3d_enums.py | 30 ++++- fast64_internal/f3d/f3d_gbi.py | 47 ++++---- fast64_internal/f3d/f3d_material.py | 113 +++++++++--------- fast64_internal/f3d/f3d_parser.py | 5 +- fast64_internal/f3d/f3d_writer.py | 34 ++---- fast64_internal/oot/oot_level_writer.py | 4 +- fast64_internal/oot/skeleton/operators.py | 4 +- fast64_internal/sm64/sm64_geolayout_parser.py | 3 - fast64_internal/sm64/sm64_geolayout_writer.py | 30 ++--- fast64_internal/sm64/sm64_level_writer.py | 11 +- fast64_internal/utility.py | 4 +- 11 files changed, 137 insertions(+), 148 deletions(-) diff --git a/fast64_internal/f3d/f3d_enums.py b/fast64_internal/f3d/f3d_enums.py index c979994..f3ba795 100644 --- a/fast64_internal/f3d/f3d_enums.py +++ b/fast64_internal/f3d/f3d_enums.py @@ -171,7 +171,11 @@ enumCombKey = [ enumTextConv = [ ("G_TC_CONV", "Convert", "Convert YUV to RGB"), - ("G_TC_FILTCONV", "Filter And Convert", "Applies chosen filter on cycle 1 and converts YUB to RGB in the second cycle"), + ( + "G_TC_FILTCONV", + "Filter And Convert", + "Applies chosen filter on cycle 1 and converts YUB to RGB in the second cycle", + ), ("G_TC_FILT", "Filter", "Applies chosen filter on textures with no color conversion"), ] @@ -189,11 +193,19 @@ enumTextLUT = [ enumTextLOD = [ ("G_TL_TILE", "Tile", "Shows selected color combiner tiles"), - ("G_TL_LOD", "LoD", "Enables LoD calculations, LoD tile is base tile + clamp(log2(texel/pixel)), remainder of log2(texel/pixel) ratio gets stored to LoD Fraction in the color combiner"), + ( + "G_TL_LOD", + "LoD", + "Enables LoD calculations, LoD tile is base tile + clamp(log2(texel/pixel)), remainder of log2(texel/pixel) ratio gets stored to LoD Fraction in the color combiner", + ), ] enumTextDetail = [ - ("G_TD_CLAMP", "Clamp", "Shows base tile for texel0 and texel 1 when magnifying (>1 texel/pixel), else shows LoD tiles"), + ( + "G_TD_CLAMP", + "Clamp", + "Shows base tile for texel0 and texel 1 when magnifying (>1 texel/pixel), else shows LoD tiles", + ), ("G_TD_SHARPEN", "Sharpen", "Sharpens pixel colors when magnifying (<1 texel/pixel), always shows LoD tiles"), ("G_TD_DETAIL", "Detail", "Shows base tile when magnifying (<1 texel/pixel), else shows LoD tiles + 1"), ] @@ -213,8 +225,16 @@ enumCycleType = [ enumColorDither = [("G_CD_DISABLE", "Disable", "Disable"), ("G_CD_ENABLE", "Enable", "Enable")] enumPipelineMode = [ - ("G_PM_1PRIMITIVE", "1 Primitive", "Adds in pipe sync after every tri draw. Adds significant amounts of lag. Only use in vanilla SM64 hacking projects"), - ("G_PM_NPRIMITIVE", "N Primitive", "No additional syncs are added after tri draws. Default option for every game but vanilla SM64"), + ( + "G_PM_1PRIMITIVE", + "1 Primitive", + "Adds in pipe sync after every tri draw. Adds significant amounts of lag. Only use in vanilla SM64 hacking projects", + ), + ( + "G_PM_NPRIMITIVE", + "N Primitive", + "No additional syncs are added after tri draws. Default option for every game but vanilla SM64", + ), ] enumAlphaCompare = [ diff --git a/fast64_internal/f3d/f3d_gbi.py b/fast64_internal/f3d/f3d_gbi.py index b8668e2..e713fa4 100644 --- a/fast64_internal/f3d/f3d_gbi.py +++ b/fast64_internal/f3d/f3d_gbi.py @@ -136,7 +136,7 @@ class F3D: F3DEX_GBI_2 = self.F3DEX_GBI_2 = isUcodeF3DEX2(F3D_VER) F3DEX_GBI_3 = self.F3DEX_GBI_3 = isUcodeF3DEX3(F3D_VER) F3DLP_GBI = self.F3DLP_GBI = self.F3DEX_GBI - + # F3DEX2 is F3DEX1 and F3DEX3 is F3DEX2, but F3DEX3 is not F3DEX1 if F3DEX_GBI_2: F3DEX_GBI = self.F3DEX_GBI = True @@ -179,7 +179,7 @@ class F3D: self.G_TRI1 = 0x05 self.G_TRI2 = 0x06 self.G_QUAD = 0x07 - + if F3DEX_GBI_3: self.G_RETURNNONEVISIBLE = 0xD4 self.G_BOUNDINGVERTS = 0xD5 @@ -343,7 +343,7 @@ class F3D: self.G_CLIPPING = 0x00800000 else: self.G_CLIPPING = 0x00000000 - + if F3DEX_GBI_3: self.G_ATTROFFSET_ST_ENABLE = 0x00000100 self.G_ATTROFFSET_Z_ENABLE = 0x00000800 @@ -352,7 +352,7 @@ class F3D: self.G_AMBOCCLUSION = 0x00004000 self.G_FRESNEL = 0x00008000 self.G_LIGHTING_POSITIONAL = 0x00400000 # Ignored, always on - + self.allGeomModeFlags = { "G_ZBUFFER", "G_TEXTURE_ENABLE", @@ -1623,12 +1623,12 @@ class F3D: self.G_MWO_MATRIX_ZZ_ZW_F = 0x34 self.G_MWO_MATRIX_WX_WY_F = 0x38 self.G_MWO_MATRIX_WZ_WW_F = 0x3C - + self.G_MWO_POINT_RGBA = 0x10 self.G_MWO_POINT_ST = 0x14 self.G_MWO_POINT_XYSCREEN = 0x18 self.G_MWO_POINT_ZSCREEN = 0x1C - + if F3DEX_GBI_3: self.G_MWO_AMB_OCCLUSION = 0x00 self.G_MWO_FRESNEL = 0x04 @@ -1752,7 +1752,7 @@ class F3D: return getattr(self, n) else: raise PluginError("Invalid G_MWO_b value for lights: " + n) - + def _DLHINTVALUE(self, count: int) -> int: remainderCommands = count % self.G_INPUT_BUFFER_CMDS if not self.F3DEX_GBI_3 or count == 0 or remainderCommands == 0: @@ -2063,7 +2063,7 @@ class GfxFormatter: class Vtx: - def __init__(self, position, uv, colorOrNormal, packedNormal = 0): + def __init__(self, position, uv, colorOrNormal, packedNormal=0): self.position = position self.uv = uv self.colorOrNormal = colorOrNormal @@ -3707,7 +3707,7 @@ class SPClipRatio(GbiMacro): def to_binary(self, f3d, segments): if f3d.F3DEX_GBI_3: return gsSPNoOp(f3d) - + # These values are supposed to be flipped. shortRatioPos = int.from_bytes((-self.ratio).to_bytes(2, "big", signed=True), "big", signed=False) shortRatioNeg = int.from_bytes(self.ratio.to_bytes(2, "big", signed=True), "big", signed=False) @@ -3736,8 +3736,9 @@ class SPAmbOcclusion(GbiMacro): def to_binary(self, f3d, segments): if not f3d.F3DEX_GBI_3: raise PluginError("SPAmbOcclusion requires F3DEX3 microcode") - return gsMoveWd(f3d.G_MW_FX, f3d.G_MWO_AMB_OCCLUSION, - (_SHIFTL(self.amb, 16, 16) | _SHIFTL(self.dir, 0, 16)), f3d) + return gsMoveWd( + f3d.G_MW_FX, f3d.G_MWO_AMB_OCCLUSION, (_SHIFTL(self.amb, 16, 16) | _SHIFTL(self.dir, 0, 16)), f3d + ) @dataclass(unsafe_hash=True) @@ -3749,8 +3750,9 @@ class SPFresnel(GbiMacro): def to_binary(self, f3d, segments): if not f3d.F3DEX_GBI_3: raise PluginError("SPFresnel requires F3DEX3 microcode") - return gsMoveWd(f3d.G_MW_FX, f3d.G_MWO_FRESNEL, - (_SHIFTL(self.offset, 16, 16) | _SHIFTL(self.scale, 0, 16)), f3d) + return gsMoveWd( + f3d.G_MW_FX, f3d.G_MWO_FRESNEL, (_SHIFTL(self.offset, 16, 16) | _SHIFTL(self.scale, 0, 16)), f3d + ) @dataclass(unsafe_hash=True) @@ -3762,8 +3764,7 @@ class SPAttrOffsetST(GbiMacro): def to_binary(self, f3d, segments): if not f3d.F3DEX_GBI_3: raise PluginError("SPAttrOffsetST requires F3DEX3 microcode") - return gsMoveWd(f3d.G_MW_FX, f3d.G_MWO_ATTR_OFFSET_ST, - (_SHIFTL(self.s, 16, 16) | _SHIFTL(self.t, 0, 16)), f3d) + return gsMoveWd(f3d.G_MW_FX, f3d.G_MWO_ATTR_OFFSET_ST, (_SHIFTL(self.s, 16, 16) | _SHIFTL(self.t, 0, 16)), f3d) @dataclass(unsafe_hash=True) @@ -3774,8 +3775,7 @@ class SPAttrOffsetZ(GbiMacro): def to_binary(self, f3d, segments): if not f3d.F3DEX_GBI_3: raise PluginError("SPAttrOffsetZ requires F3DEX3 microcode") - return gsMoveWd(f3d.G_MW_FX, f3d.G_MWO_ATTR_OFFSET_Z, - (_SHIFTL(self.z, 16, 16)), f3d) + return gsMoveWd(f3d.G_MW_FX, f3d.G_MWO_ATTR_OFFSET_Z, (_SHIFTL(self.z, 16, 16)), f3d) @dataclass(unsafe_hash=True) @@ -3799,8 +3799,9 @@ class SPAlphaCompareCull(GbiMacro): def to_binary(self, f3d, segments): if not f3d.F3DEX_GBI_3: raise PluginError("SPAlphaCompareCull requires F3DEX3 microcode") - return gsMoveWd(f3d.G_MW_FX, f3d.G_MWO_ALPHA_COMPARE_CULL, - (_SHIFTL(self.mode, 24, 8) | _SHIFTL(self.thresh, 16, 8)), f3d) + return gsMoveWd( + f3d.G_MW_FX, f3d.G_MWO_ALPHA_COMPARE_CULL, (_SHIFTL(self.mode, 24, 8) | _SHIFTL(self.thresh, 16, 8)), f3d + ) @dataclass(unsafe_hash=True) @@ -3940,11 +3941,7 @@ class SPSetLights(GbiMacro): data = SPNumLights("NUMLIGHTS_" + str(len(self.lights.l))).to_binary(f3d, segments) if f3d.F3DEX_GBI_3: data += gsDma2p( - f3d.G_MOVEMEM, - self.lights.startAddress, - len(self.lights.l) * 0x10 + 8, - f3d.G_MV_LIGHT, - 0x10 + f3d.G_MOVEMEM, self.lights.startAddress, len(self.lights.l) * 0x10 + 8, f3d.G_MV_LIGHT, 0x10 ) elif len(self.lights.l) == 0: # The light does not exist in python, but is added in @@ -4703,7 +4700,7 @@ class SPLightToPrimColor(GbiMacro): def to_binary(self, f3d, segments): if not f3d.F3DEX_GBI_3: raise PluginError("SPLightToPrimColor requires F3DEX3 microcode") - word0 = (_SHIFTL(f3d.G_SETPRIMCOLOR, 24, 8) | _SHIFTL(self.m, 8, 8) | _SHIFTL(self.l, 0, 8)) + word0 = _SHIFTL(f3d.G_SETPRIMCOLOR, 24, 8) | _SHIFTL(self.m, 8, 8) | _SHIFTL(self.l, 0, 8) return SPLightToRDP(self.light, self.alpha, word0).to_binary(f3d, segments) diff --git a/fast64_internal/f3d/f3d_material.py b/fast64_internal/f3d/f3d_material.py index 3f3b960..84c040d 100644 --- a/fast64_internal/f3d/f3d_material.py +++ b/fast64_internal/f3d/f3d_material.py @@ -154,10 +154,10 @@ def update_draw_layer(self, context): def all_blender_uses(rdp_settings): - ''' + """ Returns a dictionary of the external features which the blender may or may not use, or None if set_rendermode is disabled so we don't know. - ''' + """ if not rdp_settings.set_rendermode: return None is_one_cycle = rdp_settings.g_mdsft_cycletype == "G_CYC_1CYCLE" @@ -413,7 +413,7 @@ def ui_geo_mode(settings, dataHolder, layout, useDropdown): icon="TRIA_DOWN" if dataHolder.menu_geo else "TRIA_RIGHT", ) if not useDropdown or dataHolder.menu_geo: - + def indentGroup(parent, textOrProp, isText: bool): c = parent.column(align=True) if isText: @@ -426,7 +426,7 @@ def ui_geo_mode(settings, dataHolder, layout, useDropdown): c.label(text="") c = c.column(align=True) return c - + isF3DEX3 = bpy.context.scene.f3d_type == "F3DEX3" lightFxPrereq = isF3DEX3 and settings.g_lighting if isinstance(dataHolder, F3DMaterialProperty): @@ -473,7 +473,7 @@ def ui_geo_mode(settings, dataHolder, layout, useDropdown): c.prop(settings, "g_lighttoalpha") c.prop(settings, "g_fresnel") c.prop(settings, "g_fog") - + if lightFxPrereq and settings.g_fog and settings.g_fresnel: c.label(text="Fog overrides Fresnel.", icon="ERROR") elif lightFxPrereq and settings.g_fog and settings.g_lighttoalpha: @@ -871,7 +871,7 @@ class F3DPanel(bpy.types.Panel): if f3dMat.set_ao: prop_split(inputGroup.row(), f3dMat, "ao_ambient", "AO Ambient") prop_split(inputGroup.row(), f3dMat, "ao_directional", "AO Directional") - + if f3dMat.rdp_settings.g_fresnel: if showCheckBox or f3dMat.set_fresnel: inputGroup = inputCol.column() @@ -914,21 +914,19 @@ class F3DPanel(bpy.types.Panel): settings = f3dMat.rdp_settings isF3DEX3 = bpy.context.scene.f3d_type == "F3DEX3" lightFxPrereq = isF3DEX3 and settings.g_lighting - + blendUse = all_blender_uses(settings) anyUseShadeAlpha = useDict["Shade Alpha"] or blendUse["Shade Alpha"] - + g_lighting = settings.g_lighting g_fog = settings.g_fog g_packed_normals = lightFxPrereq and settings.g_packed_normals g_ambocclusion = lightFxPrereq and settings.g_ambocclusion g_lighttoalpha = lightFxPrereq and settings.g_lighttoalpha g_fresnel = lightFxPrereq and settings.g_fresnel - + usesVertexColor = useDict["Shade"] and (not g_lighting or g_packed_normals) - usesVertexAlpha = anyUseShadeAlpha and (g_ambocclusion or not ( - g_fog or g_lighttoalpha or g_fresnel - )) + usesVertexAlpha = anyUseShadeAlpha and (g_ambocclusion or not (g_fog or g_lighttoalpha or g_fresnel)) if not usesVertexColor and not usesVertexAlpha: return noticeBox = layout.box().column() @@ -939,7 +937,6 @@ class F3DPanel(bpy.types.Panel): else: noticeBox.label(text="There must be two vertex color layers.", icon="IMAGE_RGB_ALPHA") noticeBox.label(text='They must be called "Col" and "Alpha".', icon="IMAGE_ALPHA") - def checkDrawMixedCIWarning(self, layout, useDict, f3dMat): useTex0 = useDict["Texture 0"] and f3dMat.tex0.tex_set @@ -2690,105 +2687,105 @@ class RDPSettings(bpy.types.PropertyGroup): name="Z Buffer", default=True, update=update_node_values_with_preset, - description="Enables calculation of Z value for primitives. Disable if not reading or writing Z-Buffer in the blender" + description="Enables calculation of Z value for primitives. Disable if not reading or writing Z-Buffer in the blender", ) g_shade: bpy.props.BoolProperty( name="Shading", default=True, update=update_node_values_with_preset, - description="Computes shade coordinates for primitives. Disable if not using lighting, vertex colors or fog" + description="Computes shade coordinates for primitives. Disable if not using lighting, vertex colors or fog", ) # v1/2 difference g_cull_front: bpy.props.BoolProperty( name="Cull Front", default=False, update=update_node_values_with_preset, - description="Disables drawing of front faces" + description="Disables drawing of front faces", ) # v1/2 difference g_cull_back: bpy.props.BoolProperty( name="Cull Back", default=True, update=update_node_values_with_preset, - description="Disables drawing of back faces" + description="Disables drawing of back faces", ) g_attroffset_st_enable: bpy.props.BoolProperty( name="ST Offset (for UV scroll)", default=False, update=update_node_values_with_preset, - description="F3DEX3: Enables offsets to vertex ST values, usually for UV scrolling" + description="F3DEX3: Enables offsets to vertex ST values, usually for UV scrolling", ) g_attroffset_z_enable: bpy.props.BoolProperty( name="Z Offset (for decal fix)", default=False, update=update_node_values_with_preset, - description="F3DEX3: Enables offset to vertex Z. To fix decals, set the Z mode to opaque and enable this" + description="F3DEX3: Enables offset to vertex Z. To fix decals, set the Z mode to opaque and enable this", ) g_packed_normals: bpy.props.BoolProperty( name="Packed Normals (Vtx Colors + Lighting)", default=False, update=update_node_values_with_preset, - description="F3DEX3: Packs vertex normals in unused 16 bits of each vertex, enabling simultaneous vertex colors and lighting" + description="F3DEX3: Packs vertex normals in unused 16 bits of each vertex, enabling simultaneous vertex colors and lighting", ) g_lighttoalpha: bpy.props.BoolProperty( name="Light to Alpha (for cel shading)", default=False, update=update_node_values_with_preset, - description="F3DEX3: Moves light intensity to shade alpha, used for cel shading and other effects" + description="F3DEX3: Moves light intensity to shade alpha, used for cel shading and other effects", ) g_ambocclusion: bpy.props.BoolProperty( name="Ambient Occlusion", default=False, update=update_node_values_with_preset, - description="F3DEX3: Scales ambient and/or directional light intensity with vertex alpha. Bake scene shadows / AO into vertex alpha, not vertex color" + description="F3DEX3: Scales ambient and/or directional light intensity with vertex alpha. Bake scene shadows / AO into vertex alpha, not vertex color", ) g_fresnel: bpy.props.BoolProperty( name="Fresnel", default=False, update=update_node_values_with_preset, - description="F3DEX3: Shade alpha derived from how much each vertex normal faces the camera. For water and toon outlines" + description="F3DEX3: Shade alpha derived from how much each vertex normal faces the camera. For water and toon outlines", ) g_fog: bpy.props.BoolProperty( name="Fog", default=False, update=update_node_values_with_preset, - description="Turns on/off fog calculation. Fog variable gets stored into shade alpha" + description="Turns on/off fog calculation. Fog variable gets stored into shade alpha", ) g_lighting: bpy.props.BoolProperty( name="Lighting", default=True, update=update_node_values_with_preset, - description="Enables calculating shade color using lights. Turn off for vertex colors as shade color" + description="Enables calculating shade color using lights. Turn off for vertex colors as shade color", ) g_tex_gen: bpy.props.BoolProperty( name="Texture UV Generate", default=False, update=update_node_values_with_preset, - description="Generates texture coordinates for reflection mapping based on vertex normals and lookat direction. On a skybox texture, maps the sky to the center of the texture and the ground to a circle inscribed in the border. Requires lighting enabled to use" + description="Generates texture coordinates for reflection mapping based on vertex normals and lookat direction. On a skybox texture, maps the sky to the center of the texture and the ground to a circle inscribed in the border. Requires lighting enabled to use", ) g_tex_gen_linear: bpy.props.BoolProperty( name="Texture UV Generate Linear", default=False, update=update_node_values_with_preset, - description="Modifies the texgen mapping; enable with texgen. Use a normal panorama image for the texture, with the sky at the top and the ground at the bottom. Requires lighting enabled to use" + description="Modifies the texgen mapping; enable with texgen. Use a normal panorama image for the texture, with the sky at the top and the ground at the bottom. Requires lighting enabled to use", ) g_lod: bpy.props.BoolProperty( name="LoD (does nothing)", default=False, update=update_node_values_with_preset, - description="Not implemented in any known microcodes. No effect whether enabled or disabled" + description="Not implemented in any known microcodes. No effect whether enabled or disabled", ) g_shade_smooth: bpy.props.BoolProperty( name="Smooth Shading", default=True, update=update_node_values_with_preset, - description="Shades primitive smoothly using interpolation between shade values for each vertex (Gouraud shading)" + description="Shades primitive smoothly using interpolation between shade values for each vertex (Gouraud shading)", ) g_clipping: bpy.props.BoolProperty( name="Clipping", default=False, update=update_node_values_with_preset, - description="F3DEX1/LX only, exact function unknown" + description="F3DEX1/LX only, exact function unknown", ) # upper half mode @@ -2798,7 +2795,7 @@ class RDPSettings(bpy.types.PropertyGroup): items=enumAlphaDither, default="G_AD_NOISE", update=update_node_values_with_preset, - description="Applies your choice dithering type to output framebuffer alpha. Dithering is used to convert high precision source colors into lower precision framebuffer values" + description="Applies your choice dithering type to output framebuffer alpha. Dithering is used to convert high precision source colors into lower precision framebuffer values", ) # v2 only g_mdsft_rgb_dither: bpy.props.EnumProperty( @@ -2806,41 +2803,41 @@ class RDPSettings(bpy.types.PropertyGroup): items=enumRGBDither, default="G_CD_MAGICSQ", update=update_node_values_with_preset, - description="Applies your choice dithering type to output framebuffer color. Dithering is used to convert high precision source colors into lower precision framebuffer values" + description="Applies your choice dithering type to output framebuffer color. Dithering is used to convert high precision source colors into lower precision framebuffer values", ) g_mdsft_combkey: bpy.props.EnumProperty( name="Chroma Key", items=enumCombKey, default="G_CK_NONE", update=update_node_values_with_preset, - description="Turns on/off the chroma key. Chroma key requires a special setup to work properly" + description="Turns on/off the chroma key. Chroma key requires a special setup to work properly", ) g_mdsft_textconv: bpy.props.EnumProperty( name="Texture Convert", items=enumTextConv, default="G_TC_FILT", update=update_node_values_with_preset, - description="Sets the function of the texture convert unit, to do texture filtering, YUV to RGB conversion, or both" + description="Sets the function of the texture convert unit, to do texture filtering, YUV to RGB conversion, or both", ) g_mdsft_text_filt: bpy.props.EnumProperty( name="Texture Filter", items=enumTextFilt, default="G_TF_BILERP", update=update_node_values_without_preset, - description="Applies your choice of filtering to texels" + description="Applies your choice of filtering to texels", ) g_mdsft_textlut: bpy.props.EnumProperty( name="Texture LUT", items=enumTextLUT, default="G_TT_NONE", - description="Changes texture look up table (LUT) behavior. This property is auto set if you choose a CI texture" + description="Changes texture look up table (LUT) behavior. This property is auto set if you choose a CI texture", ) g_mdsft_textlod: bpy.props.EnumProperty( name="Texture LOD", items=enumTextLOD, default="G_TL_TILE", update=update_node_values_with_preset, - description="Turns on/off the use of LoD on textures. LoD textures change the used tile based on the texel/pixel ratio" + description="Turns on/off the use of LoD on textures. LoD textures change the used tile based on the texel/pixel ratio", ) num_textures_mipmapped: bpy.props.IntProperty( name="Number of Mipmaps", @@ -2854,21 +2851,21 @@ class RDPSettings(bpy.types.PropertyGroup): items=enumTextDetail, default="G_TD_CLAMP", update=update_node_values_with_preset, - description="Changes type of LoD usage. Affects how tiles are selected based on texel magnification. Only works when G_TL_LOD is selected" + description="Changes type of LoD usage. Affects how tiles are selected based on texel magnification. Only works when G_TL_LOD is selected", ) g_mdsft_textpersp: bpy.props.EnumProperty( name="Texture Perspective Correction", items=enumTextPersp, default="G_TP_PERSP", update=update_node_values_with_preset, - description="Turns on/off texture perspective correction" + description="Turns on/off texture perspective correction", ) g_mdsft_cycletype: bpy.props.EnumProperty( name="Cycle Type", items=enumCycleType, default="G_CYC_1CYCLE", update=update_node_values_with_preset, - description="Changes RDP pipeline configuration. For normal textured triangles use one or two cycle mode" + description="Changes RDP pipeline configuration. For normal textured triangles use one or two cycle mode", ) # v1 only g_mdsft_color_dither: bpy.props.EnumProperty( @@ -2876,14 +2873,14 @@ class RDPSettings(bpy.types.PropertyGroup): items=enumColorDither, default="G_CD_ENABLE", update=update_node_values_with_preset, - description="Applies your choice dithering type to output frambuffer" + description="Applies your choice dithering type to output frambuffer", ) g_mdsft_pipeline: bpy.props.EnumProperty( name="Pipeline Span Buffer Coherency", items=enumPipelineMode, default="G_PM_1PRIMITIVE", update=update_node_values_with_preset, - description="Changes primitive rasterization timing by adding syncs after tri draws. Vanilla SM64 has synchronization issues which could cause a crash if not using 1 prim. For any modern SM64 hacking project or other game N-prim should always be used" + description="Changes primitive rasterization timing by adding syncs after tri draws. Vanilla SM64 has synchronization issues which could cause a crash if not using 1 prim. For any modern SM64 hacking project or other game N-prim should always be used", ) # lower half mode @@ -2892,14 +2889,14 @@ class RDPSettings(bpy.types.PropertyGroup): items=enumAlphaCompare, default="G_AC_NONE", update=update_node_values_with_preset, - description="Uses alpha comparisons to decide if a pixel should be written. Applies before blending" + description="Uses alpha comparisons to decide if a pixel should be written. Applies before blending", ) g_mdsft_zsrcsel: bpy.props.EnumProperty( name="Z Source Selection", items=enumDepthSource, default="G_ZS_PIXEL", update=update_node_values_with_preset, - description="Changes screen-space Z value source used for Z-Buffer calculations" + description="Changes screen-space Z value source used for Z-Buffer calculations", ) prim_depth: bpy.props.PointerProperty( @@ -2938,47 +2935,45 @@ class RDPSettings(bpy.types.PropertyGroup): ) aa_en: bpy.props.BoolProperty( update=update_node_values_with_preset, - description="Enables anti-aliasing to rasterized primitive edges. Uses coverage to determine edges" + description="Enables anti-aliasing to rasterized primitive edges. Uses coverage to determine edges", ) z_cmp: bpy.props.BoolProperty( - update=update_node_values_with_preset, - description="Checks pixel Z value against Z-Buffer to test writing" + update=update_node_values_with_preset, description="Checks pixel Z value against Z-Buffer to test writing" ) z_upd: bpy.props.BoolProperty( update=update_node_values_with_preset, - description="Updates the Z-Buffer with the most recently written pixel Z value" + description="Updates the Z-Buffer with the most recently written pixel Z value", ) im_rd: bpy.props.BoolProperty( - update=update_node_values_with_preset, - description="Enables reading from framebuffer for blending calculations" + update=update_node_values_with_preset, description="Enables reading from framebuffer for blending calculations" ) clr_on_cvg: bpy.props.BoolProperty( update=update_node_values_with_preset, - description="Only draw on coverage (amount primitive covers target pixel) overflow" + description="Only draw on coverage (amount primitive covers target pixel) overflow", ) cvg_dst: bpy.props.EnumProperty( name="Coverage Destination", items=enumCoverage, update=update_node_values_with_preset, - description="Changes how coverage (amount primitive covers target pixel) gets retrieved/stored" + description="Changes how coverage (amount primitive covers target pixel) gets retrieved/stored", ) zmode: bpy.props.EnumProperty( name="Z Mode", items=enumZMode, update=update_node_values_with_preset, - description="Changes Z calculation for different types of primitives" + description="Changes Z calculation for different types of primitives", ) cvg_x_alpha: bpy.props.BoolProperty( update=update_node_values_with_preset, - description="Multiply coverage (amount primitive covers target pixel) with alpha and store result as coverage" + description="Multiply coverage (amount primitive covers target pixel) with alpha and store result as coverage", ) alpha_cvg_sel: bpy.props.BoolProperty( update=update_node_values_with_preset, - description="Use coverage (amount primitive covers target pixel) as alpha instead of color combiner alpha" + description="Use coverage (amount primitive covers target pixel) as alpha instead of color combiner alpha", ) force_bl: bpy.props.BoolProperty( update=update_node_values_with_preset, - description="Always uses blending on. Default blending is conditionally only applied during partial coverage. Forcing blending will disable division step of the blender, so B input must be 1-A or there may be rendering issues. Always use this option when Z Buffering is off" + description="Always uses blending on. Default blending is conditionally only applied during partial coverage. Forcing blending will disable division step of the blender, so B input must be 1-A or there may be rendering issues. Always use this option when Z Buffering is off", ) # cycle dependent - (P * A + M - B) / (A + B) @@ -4092,9 +4087,11 @@ def mat_register(): bpy.types.Scene.isHWv1 = bpy.props.BoolProperty( name="Is Hardware v1?", default=False, - description=("Only early N64 devkits have V1 RCP chips; all retail consoles have V2. " + description=( + "Only early N64 devkits have V1 RCP chips; all retail consoles have V2. " + "Display lists made for V1 and V2 are incompatible with each other, " - + "so any hardware which can play retail games is V2") + + "so any hardware which can play retail games is V2" + ), ) # RDP Defaults diff --git a/fast64_internal/f3d/f3d_parser.py b/fast64_internal/f3d/f3d_parser.py index 2b9977b..031eeb1 100644 --- a/fast64_internal/f3d/f3d_parser.py +++ b/fast64_internal/f3d/f3d_parser.py @@ -1582,10 +1582,7 @@ class F3DContext: mat.fresnel_hi = (1.0 / scale) + offset mat.set_fresnel = True elif command.name == "gsSPAttrOffsetST": - mat.attroffs_st = [ - from_s16_str(command.params[0]) / 32, - from_s16_str(command.params[1]) / 32 - ] + mat.attroffs_st = [from_s16_str(command.params[0]) / 32, from_s16_str(command.params[1]) / 32] mat.set_attroffs_st = True elif command.name == "gsSPAttrOffsetZ": mat.attroffs_z = from_s16_str(command.params[0]) diff --git a/fast64_internal/f3d/f3d_writer.py b/fast64_internal/f3d/f3d_writer.py index 2154e32..754a43c 100644 --- a/fast64_internal/f3d/f3d_writer.py +++ b/fast64_internal/f3d/f3d_writer.py @@ -117,9 +117,7 @@ def getInfoDict(obj): edgeDict[edgeKey].append(face) for loopIndex in face.loops: - convertInfo = LoopConvertInfo( - uv_data, obj, obj.material_slots[face.material_index].material - ) + convertInfo = LoopConvertInfo(uv_data, obj, obj.material_slots[face.material_index].material) f3dVertDict[loopIndex] = getF3DVert(mesh.loops[loopIndex], face, convertInfo, mesh) for face in mesh.loop_triangles: for edgeKey in face.edge_keys: @@ -184,7 +182,6 @@ def fixLargeUVs(obj): uvOffset = [0, 0] for i in range(2): - # Move any UVs close to or straddling edge minDiff = (-cellSize[i] + 2) - minUV[i] if minDiff > 0: @@ -320,7 +317,7 @@ def saveMeshWithLargeTexturesByFaces( firstFace = False triGroup.triList.commands.append(SPEndDisplayList()) - + if fMaterial.revert is not None: fMesh.draw.commands.append(SPDisplayList(fMaterial.revert)) @@ -692,7 +689,7 @@ class F3DVert: and self.normal == other.normal and self.alpha == other.alpha ) - + def toVtx(self, mesh, texDimensions, transformMatrix, isPointSampled: bool, tex_scale=(1, 1)) -> Vtx: # Position (8 bytes) position = [int(round(floatValue)) for floatValue in (transformMatrix @ self.position)] @@ -953,7 +950,7 @@ def getF3DVert(loop: bpy.types.MeshLoop, face, convertInfo: LoopConvertInfo, mes uv[:] = [field if not math.isnan(field) else 0 for field in uv] uv[1] = 1 - uv[1] uv = uv.freeze() - + has_rgb, has_normal, _ = getRgbNormalSettings(convertInfo.material.f3d_mat) mesh = convertInfo.obj.data color = getLoopColor(loop, mesh) @@ -973,7 +970,7 @@ def getLoopNormal(loop: bpy.types.MeshLoop): ( round(loop.normal[0] * 2**16) / 2**16, round(loop.normal[1] * 2**16) / 2**16, - round(loop.normal[2] * 2**16) / 2**16 + round(loop.normal[2] * 2**16) / 2**16, ) ).freeze() @@ -1008,18 +1005,16 @@ def getLoopColor(loop: bpy.types.MeshLoop, mesh): def createTriangleCommands(triangles, vertexBuffer, useSP2Triangle): triangles = copy.deepcopy(triangles) commands = [] - + def getIndices(tri): return [vertexBuffer.index(v) for v in tri] - + t = 0 while t < len(triangles): firstTriIndices = getIndices(triangles[t]) t += 1 if useSP2Triangle and t < len(triangles): - commands.append( - SP2Triangles(*firstTriIndices, 0, *getIndices(triangles[t]), 0) - ) + commands.append(SP2Triangles(*firstTriIndices, 0, *getIndices(triangles[t]), 0)) t += 1 else: commands.append(SP1Triangle(*firstTriIndices, 0)) @@ -1146,7 +1141,7 @@ def saveOrGetF3DMaterial(material, fModel, obj, drawLayer, convertTextureData): f3dMat.combiner1.D_alpha, ) ) - + if f3dMat.set_ao: fMaterial.mat_only_DL.commands.append( SPAmbOcclusion( @@ -1154,7 +1149,7 @@ def saveOrGetF3DMaterial(material, fModel, obj, drawLayer, convertTextureData): min(round(f3dMat.ao_directional * 2**16), 0xFFFF), ) ) - + if f3dMat.set_fresnel: offset = min(round(f3dMat.fresnel_lo * 2**15), 0x7FFF) scalePre = 256.0 / (f3dMat.fresnel_hi - f3dMat.fresnel_lo) @@ -1210,7 +1205,7 @@ def saveOrGetF3DMaterial(material, fModel, obj, drawLayer, convertTextureData): defaults, fModel.f3d._HW_VERSION_1, fModel.matWriteMethod, - fModel.f3d + fModel.f3d, ) saveOtherModeLDefinition(fMaterial, f3dMat.rdp_settings, defaults, defaultRM, fModel.matWriteMethod, fModel.f3d) saveOtherDefinition(fMaterial, f3dMat, defaults) @@ -1393,7 +1388,7 @@ def saveGeoModeCommon(saveFunc, settings, defaults, args): if isUcodeF3DEX1(bpy.context.scene.f3d_type): saveFunc(settings.g_clipping, defaults.g_clipping, "G_CLIPPING", *args) - + def saveGeoModeDefinitionF3DEX2(fMaterial, settings, defaults, matWriteMethod): geo = SPGeometryMode([], []) saveGeoModeCommon(saveBitGeoF3DEX2, settings, defaults, (geo, matWriteMethod)) @@ -1653,10 +1648,7 @@ def getWriteMethodFromEnum(enumVal): return matWriteMethodEnumDict[enumVal] -def exportF3DtoC( - dirPath, obj, DLFormat, transformMatrix, texDir, savePNG, texSeparate, name, matWriteMethod -): - +def exportF3DtoC(dirPath, obj, DLFormat, transformMatrix, texDir, savePNG, texSeparate, name, matWriteMethod): inline = bpy.context.scene.exportInlineF3D fModel = FModel(name, DLFormat, matWriteMethod if not inline else GfxMatWriteMethod.WriteAll) fMeshes = exportF3DCommon(obj, fModel, transformMatrix, True, name, DLFormat, not savePNG) diff --git a/fast64_internal/oot/oot_level_writer.py b/fast64_internal/oot/oot_level_writer.py index 96fc98a..797417f 100644 --- a/fast64_internal/oot/oot_level_writer.py +++ b/fast64_internal/oot/oot_level_writer.py @@ -104,9 +104,7 @@ def ootCombineSceneFiles(levelC): return sceneC -def ootExportSceneToC( - originalSceneObj, transformMatrix, sceneName, DLFormat, savePNG, exportInfo, bootToSceneOptions -): +def ootExportSceneToC(originalSceneObj, transformMatrix, sceneName, DLFormat, savePNG, exportInfo, bootToSceneOptions): checkObjectReference(originalSceneObj, "Scene object") isCustomExport = exportInfo.isCustomExportPath exportPath = exportInfo.exportPath diff --git a/fast64_internal/oot/skeleton/operators.py b/fast64_internal/oot/skeleton/operators.py index 372c93e..e367379 100644 --- a/fast64_internal/oot/skeleton/operators.py +++ b/fast64_internal/oot/skeleton/operators.py @@ -122,9 +122,7 @@ class OOT_ExportSkeleton(Operator): saveTextures = context.scene.saveTextures drawLayer = armatureObj.ootDrawLayer - ootConvertArmatureToC( - armatureObj, finalTransform, DLFormat.Static, saveTextures, drawLayer, exportSettings - ) + ootConvertArmatureToC(armatureObj, finalTransform, DLFormat.Static, saveTextures, drawLayer, exportSettings) self.report({"INFO"}, "Success!") return {"FINISHED"} diff --git a/fast64_internal/sm64/sm64_geolayout_parser.py b/fast64_internal/sm64/sm64_geolayout_parser.py index d7cc46b..555007c 100644 --- a/fast64_internal/sm64/sm64_geolayout_parser.py +++ b/fast64_internal/sm64/sm64_geolayout_parser.py @@ -796,7 +796,6 @@ def parseDL( segmentData, vertexBuffer, ): - drawLayer = bitMask(currentCmd[1], 0, 4) romfile.seek(currentAddress) @@ -941,7 +940,6 @@ def handleNodeCommon( boneGroupName, vertexBuffer, ): - boneName = format(nodeIndex, "03") + "-" + boneGroupName.lower() if armatureObj is not None: @@ -1411,7 +1409,6 @@ def getMarioBoneName(startRelativeAddr, armatureData, default="sm64_mesh"): def assignMarioGeoMetadata(obj, commandAddress, geoStartAddress, cmdType, armatureData, lastTransRotAddr=None): - # for geo_pointer reading offsets: # cmd = 0 # draw layer = 1 diff --git a/fast64_internal/sm64/sm64_geolayout_writer.py b/fast64_internal/sm64/sm64_geolayout_writer.py index d30ffb1..e1d723c 100644 --- a/fast64_internal/sm64/sm64_geolayout_writer.py +++ b/fast64_internal/sm64/sm64_geolayout_writer.py @@ -353,10 +353,7 @@ def appendRevertToGeolayout(geolayoutGraph, fModel): # Convert to Geolayout -def convertArmatureToGeolayout( - armatureObj, obj, convertTransformMatrix, camera, name, DLFormat, convertTextureData -): - +def convertArmatureToGeolayout(armatureObj, obj, convertTransformMatrix, camera, name, DLFormat, convertTextureData): inline = bpy.context.scene.exportInlineF3D fModel = SM64Model( name, @@ -424,7 +421,6 @@ def convertArmatureToGeolayout( def convertObjectToGeolayout( obj, convertTransformMatrix, camera, name, fModel: FModel, areaObj, DLFormat, convertTextureData ): - inline = bpy.context.scene.exportInlineF3D if fModel is None: fModel = SM64Model( @@ -801,9 +797,7 @@ def saveGeolayoutC( # Insertable Binary -def exportGeolayoutArmatureInsertableBinary( - armatureObj, obj, convertTransformMatrix, filepath, camera -): +def exportGeolayoutArmatureInsertableBinary(armatureObj, obj, convertTransformMatrix, filepath, camera): geolayoutGraph, fModel = convertArmatureToGeolayout( armatureObj, obj, convertTransformMatrix, camera, armatureObj.name, DLFormat.Static, True ) @@ -843,7 +837,6 @@ def exportGeolayoutArmatureBinaryBank0( RAMAddr, camera, ): - geolayoutGraph, fModel = convertArmatureToGeolayout( armatureObj, obj, convertTransformMatrix, camera, armatureObj.name, DLFormat.Static, True ) @@ -864,7 +857,6 @@ def exportGeolayoutObjectBinaryBank0( RAMAddr, camera, ): - geolayoutGraph, fModel = convertObjectToGeolayout( obj, convertTransformMatrix, camera, obj.name, None, None, DLFormat.Static, True ) @@ -928,7 +920,6 @@ def exportGeolayoutArmatureBinary( textDumpFilePath, camera, ): - geolayoutGraph, fModel = convertArmatureToGeolayout( armatureObj, obj, convertTransformMatrix, camera, armatureObj.name, DLFormat.Static, True ) @@ -949,7 +940,6 @@ def exportGeolayoutObjectBinary( textDumpFilePath, camera, ): - geolayoutGraph, fModel = convertObjectToGeolayout( obj, convertTransformMatrix, camera, obj.name, None, None, DLFormat.Static, True ) @@ -1007,6 +997,7 @@ def geoWriteTextDump(textDumpFilePath, geolayoutGraph, levelData): # are converted to SwitchOverrideNodes. During this process, any material # override geometry will be generated as well. + # Afterward, the node hierarchy is traversed again, and any SwitchOverride # nodes are converted to actual geolayout node hierarchies. def generateSwitchOptions(transformNode, geolayout, geolayoutGraph, prefix): @@ -1471,7 +1462,6 @@ def processMesh( transformNode = TransformNode(node) if obj.data is not None and (obj.use_render_range or obj.add_shadow or obj.add_func): - parentTransformNode.children.append(transformNode) transformNode.parent = parentTransformNode transformNode.node.hasDL = False @@ -2121,6 +2111,7 @@ def checkIfFirstNonASMNode(childNode): # parent connects child node to itself # skinned node handled by child + # A skinned mesh node should be before a mesh node. # However, other transform nodes may exist in between two mesh nodes, # So the skinned mesh node must be inserted before any of those transforms. @@ -2200,7 +2191,6 @@ def addSkinnedMeshNode(armatureObj, boneName, skinnedMesh, transformNode, parent highestChildIndex > 0 and type(highestChildNode.parent.children[highestChildIndex - 1].node) is FunctionNode ): - precedingFunctionCmds.insert(0, copy.deepcopy(highestChildNode.parent.children[highestChildIndex - 1])) highestChildIndex -= 1 # _____________ @@ -2372,7 +2362,6 @@ def saveModelGivenVertexGroup( fMeshes = {} fSkinnedMeshes = {} for drawLayer, materialFaces in skinnedFaces.items(): - meshName = getFMeshName(vertexGroup, namePrefix, drawLayer, False) checkUniqueBoneNames(fModel, meshName, vertexGroup) skinnedMeshName = getFMeshName(vertexGroup, namePrefix, drawLayer, True) @@ -2453,7 +2442,7 @@ def saveModelGivenVertexGroup( ) # Must be done after all geometry saved - for (material, specificMat, overrideType) in materialOverrides: + for material, specificMat, overrideType in materialOverrides: for drawLayer, fMesh in fMeshes.items(): saveOverrideDraw(obj, fModel, material, specificMat, overrideType, fMesh, drawLayer, convertTextureData) for drawLayer, fMesh in fSkinnedMeshes.items(): @@ -2485,7 +2474,10 @@ def saveOverrideDraw( last_replaced = None command_index = 0 - def find_material_from_jump_cmd(material_list: tuple[tuple[bpy.types.Material, str, FAreaData], tuple[FMaterial, tuple[int, int]]], dl_jump: SPDisplayList): + def find_material_from_jump_cmd( + material_list: tuple[tuple[bpy.types.Material, str, FAreaData], tuple[FMaterial, tuple[int, int]]], + dl_jump: SPDisplayList, + ): if dl_jump.displayList.tag == GfxListTag.Geometry: return None, None for mat in material_list: @@ -2619,13 +2611,13 @@ def splitSkinnedFacesIntoTwoGroups(skinnedFaces, fModel, obj, uv_data, drawLayer convertInfo = LoopConvertInfo(uv_data, obj, material) for skinnedFace in skinnedFaceArray: - for (face, loop) in skinnedFace.loopsInGroup: + for face, loop in skinnedFace.loopsInGroup: f3dVert = getF3DVert(loop, face, convertInfo, obj.data) bufferVert = BufferVertex(f3dVert, None, material_index) if bufferVert not in inGroupVerts: inGroupVerts.append(bufferVert) loopDict[loop] = f3dVert - for (face, loop) in skinnedFace.loopsNotInGroup: + for face, loop in skinnedFace.loopsNotInGroup: vert = obj.data.vertices[loop.vertex_index] if vert not in notInGroupBlenderVerts: notInGroupBlenderVerts.append(vert) diff --git a/fast64_internal/sm64/sm64_level_writer.py b/fast64_internal/sm64/sm64_level_writer.py index 78099f8..6e9ad60 100644 --- a/fast64_internal/sm64/sm64_level_writer.py +++ b/fast64_internal/sm64/sm64_level_writer.py @@ -697,10 +697,7 @@ class SM64OptionalFileStatus: self.starSelectC = False -def exportLevelC( - obj, transformMatrix, levelName, exportDir, savePNG, customExport, levelCameraVolumeName, DLFormat -): - +def exportLevelC(obj, transformMatrix, levelName, exportDir, savePNG, customExport, levelCameraVolumeName, DLFormat): fileStatus = SM64OptionalFileStatus() if customExport: @@ -725,7 +722,11 @@ def exportLevelC( puppycamVolumeString = "" inline = bpy.context.scene.exportInlineF3D - fModel = SM64Model(levelName + "_dl", DLFormat, GfxMatWriteMethod.WriteDifferingAndRevert if not inline else GfxMatWriteMethod.WriteAll) + fModel = SM64Model( + levelName + "_dl", + DLFormat, + GfxMatWriteMethod.WriteDifferingAndRevert if not inline else GfxMatWriteMethod.WriteAll, + ) childAreas = [child for child in obj.children if child.data is None and child.sm64_obj_type == "Area Root"] if len(childAreas) == 0: raise PluginError("The level root has no child empties with the 'Area Root' object type.") diff --git a/fast64_internal/utility.py b/fast64_internal/utility.py index 30766b3..50c63c9 100644 --- a/fast64_internal/utility.py +++ b/fast64_internal/utility.py @@ -1443,8 +1443,8 @@ def unpackNormalS8(packedNormal): x, y = xo & 0x7F, yo & 0x7F z = x + y zNeg = bool(z & 0x80) - x2, y2 = x ^ 0x7F, y ^ 0x7F # 7F - x, 7F - y - z = z ^ 0x7F # = 7F - x - y + x2, y2 = x ^ 0x7F, y ^ 0x7F # 7F - x, 7F - y + z = z ^ 0x7F # = 7F - x - y if zNeg: x, y = x2, y2 x, y = -x if xo & 0x80 else x, -y if yo & 0x80 else y From af0ec26de5a3d700f4f9ec1046eab04c551b2112 Mon Sep 17 00:00:00 2001 From: Sauraen Date: Sun, 15 Oct 2023 18:40:04 -0700 Subject: [PATCH 26/74] Starting cel shading port --- fast64_internal/f3d/f3d_enums.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/fast64_internal/f3d/f3d_enums.py b/fast64_internal/f3d/f3d_enums.py index f3ba795..042367f 100644 --- a/fast64_internal/f3d/f3d_enums.py +++ b/fast64_internal/f3d/f3d_enums.py @@ -390,3 +390,19 @@ enumLargeEdges = [ ("Clamp", "Clamp", "Clamp outside image bounds"), ("Wrap", "Wrap", "Wrap outside image bounds (more expensive)"), ] + +enumCelThreshMode = { + ("Lighter", "Lighter", "This cel level is drawn when the lighting level per-pixel is LIGHTER than the threshold"), + ("Darker", "Darker", "This cel level is drawn when the lighting level per-pixel is DARKER than the threshold"), +} + +enumCelTintPipeline = { + ("CC", "CC (tint in Prim Color)", "Cel shading puts tint color in Prim Color and tint level in Prim Alpha. Set up CC color to LERP between source color and tint color based on tint level, or multiply source color by tint color. Source may be Tex 0 or Env Color"), + ("Blender", "Blender (tint in Fog Color)", "Cel shading puts tint color in Fog Color and tint level in Fog Alpha. Set up blender to LERP between CC output and tint color based on tint level. Then set CC to Tex 0 * shade color (vertex colors)"), +} + +enumCelTintType = { + ("Fixed", "Fixed", "Fixed tint color and level stored directly in DL"), + ("Segment", "Segment", "Call a segmented DL to set the tint, can change at runtime"), + ("Light", "From Light", "Automatically load tint color from selectable light slot. Tint level stored in DL"), +} From 20ffb2385f6325e20266447084bafc638f3bf2a7 Mon Sep 17 00:00:00 2001 From: Sauraen Date: Mon, 16 Oct 2023 21:27:59 -0700 Subject: [PATCH 27/74] Addressed Yanies comments --- fast64_internal/f3d/f3d_gbi.py | 14 +- fast64_internal/f3d/f3d_material.py | 260 ++++++++++++----------- fast64_internal/f3d/f3d_parser.py | 4 +- fast64_internal/oot/oot_level_classes.py | 2 +- fast64_internal/utility.py | 22 +- 5 files changed, 155 insertions(+), 147 deletions(-) diff --git a/fast64_internal/f3d/f3d_gbi.py b/fast64_internal/f3d/f3d_gbi.py index e713fa4..f40b0a6 100644 --- a/fast64_internal/f3d/f3d_gbi.py +++ b/fast64_internal/f3d/f3d_gbi.py @@ -116,15 +116,15 @@ ACMUXDict = { } -def isUcodeF3DEX1(F3D_VER): +def isUcodeF3DEX1(F3D_VER: str) -> bool: return F3D_VER in {"F3DLP.Rej", "F3DLX.Rej", "F3DEX/LX"} -def isUcodeF3DEX2(F3D_VER): +def isUcodeF3DEX2(F3D_VER: str) -> bool: return F3D_VER in {"F3DEX2.Rej/LX2.Rej", "F3DEX2/LX2"} -def isUcodeF3DEX3(F3D_VER): +def isUcodeF3DEX3(F3D_VER: str) -> bool: return F3D_VER == "F3DEX3" @@ -1697,9 +1697,9 @@ class F3D: # Lighting Macros if F3DEX_GBI_3: - self.numLights = {"NUMLIGHTS_" + str(n): n for n in range(10)} + self.numLights = {f"NUMLIGHTS_{n}": n for n in range(10)} else: - self.numLights = {"NUMLIGHTS_" + str(n): (1 if n == 0 else n) for n in range(8)} + self.numLights = {f"NUMLIGHTS_{n}": (1 if n == 0 else n) for n in range(8)} def GBL_c1(self, m1a, m1b, m2a, m2b): return (m1a) << 30 | (m1b) << 26 | (m2a) << 22 | (m2b) << 18 @@ -2087,7 +2087,7 @@ class Vtx: def spc(x): return "{" + ", ".join([str(a) for a in x]) + "}" - flag = "0" if self.packedNormal == 0 else "{0:#06x}".format(self.packedNormal) + flag = "0" if self.packedNormal == 0 else f"{self.packedNormal:#06x}" return "{{ " + ", ".join([spc(self.position), flag, spc(self.uv), spc(self.colorOrNormal)]) + " }}" @@ -3377,7 +3377,7 @@ class GbiMacro: return " | ".join(field) if len(field) else "0" if self._hex > 0 and isinstance(field, int): temp = field if field >= 0 else (1 << (self._hex * 4)) + field - return "{0:#0{1}x}".format(temp, self._hex + 2) # + 2 for the 0x part + return f"{temp:#0{self._hex + 2}x}" # + 2 for the 0x part return str(field) def to_c(self, static=True): diff --git a/fast64_internal/f3d/f3d_material.py b/fast64_internal/f3d/f3d_material.py index 84c040d..4f70b40 100644 --- a/fast64_internal/f3d/f3d_material.py +++ b/fast64_internal/f3d/f3d_material.py @@ -1,6 +1,12 @@ import logging import bpy, math, os -from bpy.types import Operator, Menu +from bpy.types import ( + Attribute, Context, Image, Light, Material, + Menu, Mesh, NodeGroupOutput, NodeInputs, NodeLink, NodeSocket, + NodeTree, Object, Operator, Panel, Property, + PropertyGroup, Scene, ShaderNodeGroup, TextureNodeImage, + UILayout, VIEW3D_HT_header, World +) from bl_operators.presets import AddPresetBase from bpy.utils import register_class, unregister_class from mathutils import Color @@ -12,7 +18,7 @@ from ..utility import * from ..render_settings import Fast64RenderSettings_Properties, update_scene_props_from_render_settings from .f3d_material_helpers import F3DMaterial_UpdateLock from bpy.app.handlers import persistent -from typing import Generator, Optional, Tuple, Any +from typing import Generator, Optional, Tuple, Any, Dict F3DMaterialHash = Any # giant tuple @@ -153,7 +159,7 @@ def update_draw_layer(self, context): set_output_node_groups(material) -def all_blender_uses(rdp_settings): +def all_blender_uses(rdp_settings: "RDPSettings") -> Dict[str: bool]: """ Returns a dictionary of the external features which the blender may or may not use, or None if set_rendermode is disabled so we don't know. @@ -228,13 +234,13 @@ def get_blend_method(material): return blend_method -def update_blend_method(material: bpy.types.Material, context): +def update_blend_method(material: Material, context): material.blend_method = get_blend_method(material) if material.blend_method == "CLIP": material.alpha_threshold = 0.125 -class DrawLayerProperty(bpy.types.PropertyGroup): +class DrawLayerProperty(PropertyGroup): sm64: bpy.props.EnumProperty(items=sm64EnumDrawLayers, default="1", update=update_draw_layer) oot: bpy.props.EnumProperty(items=ootEnumDrawLayers, default="Opaque", update=update_draw_layer) @@ -524,8 +530,8 @@ def ui_geo_mode(settings, dataHolder, layout, useDropdown): c.prop(settings, "g_clipping") -def ui_upper_mode(settings, dataHolder, layout: bpy.types.UILayout, useDropdown): - inputGroup: bpy.types.UILayout = layout.column() +def ui_upper_mode(settings, dataHolder, layout: UILayout, useDropdown): + inputGroup: UILayout = layout.column() if useDropdown: inputGroup.prop( dataHolder, @@ -559,8 +565,8 @@ def ui_upper_mode(settings, dataHolder, layout: bpy.types.UILayout, useDropdown) prop_split(inputGroup, settings, "g_mdsft_pipeline", "Pipeline Span Buffer Coherency") -def ui_lower_mode(settings, dataHolder, layout: bpy.types.UILayout, useDropdown): - inputGroup: bpy.types.UILayout = layout.column() +def ui_lower_mode(settings, dataHolder, layout: UILayout, useDropdown): + inputGroup: UILayout = layout.column() if useDropdown: inputGroup.prop( dataHolder, @@ -591,7 +597,7 @@ def ui_other(settings, dataHolder, layout, useDropdown): clipRatioGroup = inputGroup.column() prop_split(clipRatioGroup, settings, "clip_ratio", "Clip Ratio") - if isinstance(dataHolder, bpy.types.Material) or isinstance(dataHolder, F3DMaterialProperty): + if isinstance(dataHolder, Material) or isinstance(dataHolder, F3DMaterialProperty): blend_color_group = layout.row() prop_input_name = blend_color_group.column() prop_input = blend_color_group.column() @@ -616,7 +622,7 @@ def tmemUsageUI(layout, textureProp): # shading = 1 # lighting = 1 # cycle type = 1 cycle -class F3DPanel(bpy.types.Panel): +class F3DPanel(Panel): bl_label = "F3D Material" bl_idname = "MATERIAL_PT_F3D_Inspector" bl_space_type = "PROPERTIES" @@ -708,7 +714,7 @@ class F3DPanel(bpy.types.Panel): prop_input.enabled = setProp return inputGroup - def ui_lights(self, f3d_mat: "F3DMaterialProperty", layout: bpy.types.UILayout, name, showCheckBox): + def ui_lights(self, f3d_mat: "F3DMaterialProperty", layout: UILayout, name, showCheckBox): inputGroup = layout.row() prop_input_left = inputGroup.column() prop_input = inputGroup.column() @@ -718,7 +724,7 @@ class F3DPanel(bpy.types.Panel): prop_input_left.label(text=name) prop_input_left.enabled = f3d_mat.rdp_settings.g_lighting and f3d_mat.rdp_settings.g_shade - lightSettings: bpy.types.UILayout = prop_input.column() + lightSettings: UILayout = prop_input.column() if f3d_mat.rdp_settings.g_lighting: prop_input_left.separator(factor=0.25) light_controls = prop_input_left.box() @@ -848,7 +854,7 @@ class F3DPanel(bpy.types.Panel): if ( hasattr(context, "object") and context.object is not None - and isinstance(context.object.data, bpy.types.Mesh) + and isinstance(context.object.data, Mesh) ): uv_layers = context.object.data.uv_layers if uv_layers.active is None or uv_layers.active.name != "UVMap": @@ -993,7 +999,7 @@ class F3DPanel(bpy.types.Panel): self.ui_misc(f3dMat, inputCol, False) - def draw_full(self, f3dMat, material, layout: bpy.types.UILayout, context): + def draw_full(self, f3dMat, material, layout: UILayout, context): layout.row().prop(material, "menu_tab", expand=True) menuTab = material.menu_tab useDict = all_combiner_uses(f3dMat) @@ -1294,14 +1300,14 @@ alpha_combiner_inputs = { } -def remove_first_link_if_exists(material: bpy.types.Material, links: tuple[bpy.types.NodeLink]): +def remove_first_link_if_exists(material: Material, links: tuple[NodeLink]): if len(links) > 0: link = links[0] material.node_tree.links.remove(link) def link_if_none_exist( - material: bpy.types.Material, fromOutput: bpy.types.NodeSocket, toInput: bpy.types.NodeSocket + material: Material, fromOutput: NodeSocket, toInput: NodeSocket ): # TODO: (V5) add output/input type annotations if len(fromOutput.links) == 0: material.node_tree.links.new(fromOutput, toInput) @@ -1358,7 +1364,7 @@ def update_node_combiner(material, combinerInputs, cycleIndex): material.node_tree.links.new(cycle_node.inputs[i], input_value) -def check_fog_settings(material: bpy.types.Material): +def check_fog_settings(material: Material): f3dMat: "F3DMaterialProperty" = material.f3d_mat fog_enabled: bool = f3dMat.rdp_settings.g_fog fog_rendermode_enabled: bool = fog_enabled @@ -1387,7 +1393,7 @@ def check_fog_settings(material: bpy.types.Material): return fog_enabled, fog_rendermode_enabled -def update_fog_nodes(material: bpy.types.Material, context: bpy.types.Context): +def update_fog_nodes(material: Material, context: Context): nodes = material.node_tree.nodes f3dMat: "F3DMaterialProperty" = material.f3d_mat @@ -1395,7 +1401,7 @@ def update_fog_nodes(material: bpy.types.Material, context: bpy.types.Context): nodes["Shade Color"].inputs["Fog"].default_value = int(fog_enabled) - fogBlender: bpy.types.ShaderNodeGroup = nodes["FogBlender"] + fogBlender: ShaderNodeGroup = nodes["FogBlender"] if fog_rendermode_enabled and fog_enabled: fogBlender.node_tree = bpy.data.node_groups["FogBlender_On"] else: @@ -1420,7 +1426,7 @@ def update_fog_nodes(material: bpy.types.Material, context: bpy.types.Context): nodes["CalcFog"].inputs["FogFar"].default_value = f3dMat.fog_position[1] -def update_noise_nodes(material: bpy.types.Material): +def update_noise_nodes(material: Material): f3dMat: "F3DMaterialProperty" = material.f3d_mat uses_noise = f3dMat.combiner1.A == "NOISE" or f3dMat.combiner2.A == "NOISE" noise_group = bpy.data.node_groups["F3DNoise_Animated" if uses_noise else "F3DNoise_NonAnimated"] @@ -1431,7 +1437,7 @@ def update_noise_nodes(material: bpy.types.Material): def update_combiner_connections( - material: bpy.types.Material, context: bpy.types.Context, combiner: (int | None) = None + material: Material, context: Context, combiner: (int | None) = None ): f3dMat: "F3DMaterialProperty" = material.f3d_mat @@ -1465,7 +1471,7 @@ def update_combiner_connections( update_node_combiner(material, combinerInputs2, 2) -def set_output_node_groups(material: bpy.types.Material): +def set_output_node_groups(material: Material): nodes = material.node_tree.nodes f3dMat: "F3DMaterialProperty" = material.f3d_mat is_one_cycle = f3dMat.rdp_settings.g_mdsft_cycletype == "G_CYC_1CYCLE" @@ -1541,7 +1547,7 @@ def update_color_node(combiner_inputs, color: Color, prefix: str): # prim_color | Prim # env_color | Env def get_color_input_update_callback(attr_name="", prefix=""): - def input_update_callback(self: bpy.types.Material, context: bpy.types.Context): + def input_update_callback(self: Material, context: Context): with F3DMaterial_UpdateLock(get_material_from_context(context)) as material: if not material: return @@ -1553,7 +1559,7 @@ def get_color_input_update_callback(attr_name="", prefix=""): return input_update_callback -def update_node_values_of_material(material: bpy.types.Material, context): +def update_node_values_of_material(material: Material, context): nodes = material.node_tree.nodes update_blend_method(material, context) @@ -1605,9 +1611,9 @@ def update_node_values_of_material(material: bpy.types.Material, context): update_fog_nodes(material, context) -def set_texture_settings_node(material: bpy.types.Material): +def set_texture_settings_node(material: Material): nodes = material.node_tree.nodes - textureSettings: bpy.types.ShaderNodeGroup = nodes["TextureSettings"] + textureSettings: ShaderNodeGroup = nodes["TextureSettings"] desired_group = bpy.data.node_groups["TextureSettings_Lite"] if (material.f3d_mat.tex0.tex and not material.f3d_mat.tex0.autoprop) or ( @@ -1630,7 +1636,7 @@ def setAutoProp(fieldProperty, pixelLength): def set_texture_size(self, tex_size, tex_index): nodes = self.node_tree.nodes - uv_basis: bpy.types.ShaderNodeGroup = nodes["UV Basis"] + uv_basis: ShaderNodeGroup = nodes["UV Basis"] inputs = uv_basis.inputs inputs[f"{tex_index} S TexSize"].default_value = tex_size[0] @@ -1642,10 +1648,10 @@ def trunc_10_2(val: float): def update_tex_values_field( - self: bpy.types.Material, texProperty: "TextureProperty", tex_size: list[int], tex_index: int + self: Material, texProperty: "TextureProperty", tex_size: list[int], tex_index: int ): nodes = self.node_tree.nodes - textureSettings: bpy.types.ShaderNodeGroup = nodes["TextureSettings"] + textureSettings: ShaderNodeGroup = nodes["TextureSettings"] inputs = textureSettings.inputs set_texture_size(self, tex_size, tex_index) @@ -1681,19 +1687,19 @@ def update_tex_values_field( inputs[str_index + " T Shift"].default_value = texProperty.T.shift -def iter_tex_nodes(node_tree: bpy.types.NodeTree, texIndex: int) -> Generator[bpy.types.TextureNodeImage, None, None]: +def iter_tex_nodes(node_tree: NodeTree, texIndex: int) -> Generator[TextureNodeImage, None, None]: for i in range(1, 5): nodeName = f"Tex{texIndex}_{i}" if node_tree.nodes.get(nodeName): yield node_tree.nodes[nodeName] -def toggle_texture_node_muting(material: bpy.types.Material, texIndex: int, isUsed: bool): +def toggle_texture_node_muting(material: Material, texIndex: int, isUsed: bool): node_tree = material.node_tree f3dMat: "F3DMaterialProperty" = material.f3d_mat # Enforce typing from generator - texNode: None | bpy.types.TextureNodeImage = None + texNode: None | TextureNodeImage = None node_3point_key = "3 Point Lerp" if texIndex == 0 else "3 Point Lerp.001" node_3point = node_tree.nodes.get(node_3point_key) @@ -1717,7 +1723,7 @@ def toggle_texture_node_muting(material: bpy.types.Material, texIndex: int, isUs def set_texture_nodes_settings( - material: bpy.types.Material, texProperty: "TextureProperty", texIndex: int, isUsed: bool + material: Material, texProperty: "TextureProperty", texIndex: int, isUsed: bool ) -> list[int] | None: node_tree = material.node_tree f3dMat: "F3DMaterialProperty" = material.f3d_mat @@ -1731,7 +1737,7 @@ def set_texture_nodes_settings( return texSize # Enforce typing from generator - texNode: None | bpy.types.TextureNodeImage = None + texNode: None | TextureNodeImage = None for texNode in iter_tex_nodes(node_tree, texIndex): if texNode.image is not texProperty.tex: texNode.image = texProperty.tex @@ -1748,7 +1754,7 @@ def set_texture_nodes_settings( return texSize -def update_tex_values_index(self: bpy.types.Material, *, texProperty: "TextureProperty", texIndex: int, isUsed: bool): +def update_tex_values_index(self: Material, *, texProperty: "TextureProperty", texIndex: int, isUsed: bool): nodes = self.node_tree.nodes tex_size = set_texture_nodes_settings(self, texProperty, texIndex, isUsed) @@ -1821,11 +1827,11 @@ def get_tex_gen_size(tex_size: list[int | float]): return (tex_size[0] - 1) / 1024, (tex_size[1] - 1) / 1024 -def update_tex_values_manual(material: bpy.types.Material, context, prop_path=None): +def update_tex_values_manual(material: Material, context, prop_path=None): f3dMat: "F3DMaterialProperty" = material.f3d_mat nodes = material.node_tree.nodes texture_settings = nodes["TextureSettings"] - texture_inputs: bpy.types.NodeInputs = texture_settings.inputs + texture_inputs: NodeInputs = texture_settings.inputs useDict = all_combiner_uses(f3dMat) tex0_used = useDict["Texture 0"] and f3dMat.tex0.tex is not None @@ -1858,7 +1864,7 @@ def update_tex_values_manual(material: bpy.types.Material, context, prop_path=No texture_inputs["1 S TexSize"].default_value = f3dMat.tex1.tex.size[0] texture_inputs["1 T TexSize"].default_value = f3dMat.tex1.tex.size[0] - uv_basis: bpy.types.ShaderNodeGroup = nodes["UV Basis"] + uv_basis: ShaderNodeGroup = nodes["UV Basis"] if f3dMat.uv_basis == "TEXEL0": uv_basis.node_tree = bpy.data.node_groups["UV Basis 0"] else: @@ -1952,7 +1958,7 @@ def update_preset_manual_v4(material, preset): material.f3d_update_flag = False -def has_f3d_nodes(material: bpy.types.Material): +def has_f3d_nodes(material: Material): return "Material Output F3D" in material.node_tree.nodes @@ -2009,27 +2015,27 @@ def createOrUpdateSceneProperties(): new_group["version"] = SCENE_PROPERTIES_VERSION # Create outputs - _nodeFogEnable: bpy.types.NodeSocketInt = new_group.outputs.new("NodeSocketInt", "FogEnable") - _nodeFogColor: bpy.types.NodeSocketColor = new_group.outputs.new("NodeSocketColor", "FogColor") - _nodeF3D_NearClip: bpy.types.NodeSocketFloat = new_group.outputs.new("NodeSocketFloat", "F3D_NearClip") - _nodeF3D_FarClip: bpy.types.NodeSocketFloat = new_group.outputs.new("NodeSocketFloat", "F3D_FarClip") - _nodeBlender_Game_Scale: bpy.types.NodeSocketFloat = new_group.outputs.new("NodeSocketFloat", "Blender_Game_Scale") - _nodeFogNear: bpy.types.NodeSocketInt = new_group.outputs.new("NodeSocketInt", "FogNear") - _nodeFogFar: bpy.types.NodeSocketInt = new_group.outputs.new("NodeSocketInt", "FogFar") - _nodeShadeColor: bpy.types.NodeSocketColor = new_group.outputs.new("NodeSocketColor", "ShadeColor") - _nodeAmbientColor: bpy.types.NodeSocketColor = new_group.outputs.new("NodeSocketColor", "AmbientColor") - _nodeLightDirection: bpy.types.NodeSocketVectorDirection = new_group.outputs.new( + _nodeFogEnable: NodeSocketInt = new_group.outputs.new("NodeSocketInt", "FogEnable") + _nodeFogColor: NodeSocketColor = new_group.outputs.new("NodeSocketColor", "FogColor") + _nodeF3D_NearClip: NodeSocketFloat = new_group.outputs.new("NodeSocketFloat", "F3D_NearClip") + _nodeF3D_FarClip: NodeSocketFloat = new_group.outputs.new("NodeSocketFloat", "F3D_FarClip") + _nodeBlender_Game_Scale: NodeSocketFloat = new_group.outputs.new("NodeSocketFloat", "Blender_Game_Scale") + _nodeFogNear: NodeSocketInt = new_group.outputs.new("NodeSocketInt", "FogNear") + _nodeFogFar: NodeSocketInt = new_group.outputs.new("NodeSocketInt", "FogFar") + _nodeShadeColor: NodeSocketColor = new_group.outputs.new("NodeSocketColor", "ShadeColor") + _nodeAmbientColor: NodeSocketColor = new_group.outputs.new("NodeSocketColor", "AmbientColor") + _nodeLightDirection: NodeSocketVectorDirection = new_group.outputs.new( "NodeSocketVectorDirection", "LightDirection" ) # Set outputs from render settings - sceneOutputs: bpy.types.NodeGroupOutput = new_group.nodes["Group Output"] + sceneOutputs: NodeGroupOutput = new_group.nodes["Group Output"] renderSettings: "Fast64RenderSettings_Properties" = bpy.context.scene.fast64.renderSettings update_scene_props_from_render_settings(bpy.context, sceneOutputs, renderSettings) -def createScenePropertiesForMaterial(material: bpy.types.Material): +def createScenePropertiesForMaterial(material: Material): node_tree = material.node_tree # Either create or update SceneProperties if needed @@ -2084,16 +2090,16 @@ def link_f3d_material_library(): bpy.ops.object.mode_set(mode=get_mode_set_from_context_mode(prevMode)) -def shouldConvOrCreateColorAttribute(mesh: bpy.types.Mesh, attr_name="Col"): +def shouldConvOrCreateColorAttribute(mesh: Mesh, attr_name="Col"): has_attr, conv_attr = False, False if attr_name in mesh.attributes: - attribute: bpy.types.Attribute = mesh.attributes[attr_name] + attribute: Attribute = mesh.attributes[attr_name] has_attr = True conv_attr = attribute.data_type != "FLOAT_COLOR" or attribute.domain != "CORNER" return has_attr, conv_attr -def convertColorAttribute(mesh: bpy.types.Mesh, attr_name="Col"): +def convertColorAttribute(mesh: Mesh, attr_name="Col"): prev_index = mesh.attributes.active_index attr_index = mesh.attributes.find(attr_name) if attr_index < 0: @@ -2104,8 +2110,8 @@ def convertColorAttribute(mesh: bpy.types.Mesh, attr_name="Col"): mesh.attributes.active_index = prev_index -def addColorAttributesToModel(obj: bpy.types.Object): - if not isinstance(obj.data, bpy.types.Mesh): +def addColorAttributesToModel(obj: Object): + if not isinstance(obj.data, Mesh): return prevMode = bpy.context.mode @@ -2114,7 +2120,7 @@ def addColorAttributesToModel(obj: bpy.types.Object): selectSingleObject(obj) - mesh: bpy.types.Mesh = obj.data + mesh: Mesh = obj.data conv_col, has_col = shouldConvOrCreateColorAttribute(mesh, attr_name="Col") if conv_col: @@ -2132,7 +2138,7 @@ def addColorAttributesToModel(obj: bpy.types.Object): bpy.ops.object.mode_set(mode=get_mode_set_from_context_mode(prevMode)) -def createF3DMat(obj: bpy.types.Object | None, preset="Shaded Solid", index=None): +def createF3DMat(obj: Object | None, preset="Shaded Solid", index=None): # link all node_groups + material from addon's data .blend link_f3d_material_library() @@ -2176,7 +2182,7 @@ def reloadDefaultF3DPresets(): update_preset_manual_v4(material, presetNameToFilename[material.f3d_mat.presetName]) -class CreateFast3DMaterial(bpy.types.Operator): +class CreateFast3DMaterial(Operator): bl_idname = "object.create_f3d_mat" bl_label = "Create Fast3D Material" bl_options = {"REGISTER", "UNDO", "PRESET"} @@ -2192,7 +2198,7 @@ class CreateFast3DMaterial(bpy.types.Operator): return {"FINISHED"} -class ReloadDefaultF3DPresets(bpy.types.Operator): +class ReloadDefaultF3DPresets(Operator): bl_idname = "object.reload_f3d_presets" bl_label = "Reload Default Fast3D Presets" bl_options = {"REGISTER", "UNDO", "PRESET"} @@ -2203,18 +2209,18 @@ class ReloadDefaultF3DPresets(bpy.types.Operator): return {"FINISHED"} -def get_tex_prop_from_path(material: bpy.types.Material, path: str) -> Tuple["TextureProperty", int]: +def get_tex_prop_from_path(material: Material, path: str) -> Tuple["TextureProperty", int]: if "tex0" in path: return material.f3d_mat.tex0, 0 return material.f3d_mat.tex1, 1 -def already_updating_material(material: bpy.types.Material | None): +def already_updating_material(material: Material | None): """Check if material is updating already""" return getattr(material, "f3d_update_flag", False) -def update_tex_field_prop(self: bpy.types.Property, context: bpy.types.Context): +def update_tex_field_prop(self: Property, context: Context): with F3DMaterial_UpdateLock(get_material_from_context(context)) as material: if not material: return @@ -2228,7 +2234,7 @@ def update_tex_field_prop(self: bpy.types.Property, context: bpy.types.Context): set_texture_settings_node(material) -def toggle_auto_prop(self, context: bpy.types.Context): +def toggle_auto_prop(self, context: Context): with F3DMaterial_UpdateLock(get_material_from_context(context)) as material: if not material: return @@ -2245,7 +2251,7 @@ def toggle_auto_prop(self, context: bpy.types.Context): set_texture_settings_node(material) -class TextureFieldProperty(bpy.types.PropertyGroup): +class TextureFieldProperty(PropertyGroup): clamp: bpy.props.BoolProperty( name="Clamp", update=update_tex_field_prop, @@ -2284,7 +2290,7 @@ class TextureFieldProperty(bpy.types.PropertyGroup): return (self.clamp, self.mirror, round(self.low * 4), round(self.high * 4), self.mask, self.shift) -class SetTileSizeScrollProperty(bpy.types.PropertyGroup): +class SetTileSizeScrollProperty(PropertyGroup): s: bpy.props.IntProperty(min=-4095, max=4095, default=0) t: bpy.props.IntProperty(min=-4095, max=4095, default=0) interval: bpy.props.IntProperty(min=1, soft_max=1000, default=1) @@ -2293,9 +2299,9 @@ class SetTileSizeScrollProperty(bpy.types.PropertyGroup): return (self.s, self.t, self.interval) -class TextureProperty(bpy.types.PropertyGroup): +class TextureProperty(PropertyGroup): tex: bpy.props.PointerProperty( - type=bpy.types.Image, + type=Image, name="Texture", update=update_tex_values_and_formats, ) @@ -2390,7 +2396,7 @@ def on_tex_autoprop(texProperty, context): setAutoProp(texProperty.T, tex_size[1]) -def update_combiner_connections_and_preset(self, context: bpy.types.Context): +def update_combiner_connections_and_preset(self, context: Context): with F3DMaterial_UpdateLock(get_material_from_context(context)) as material: if not material: return @@ -2409,8 +2415,8 @@ def update_combiner_connections_and_preset(self, context: bpy.types.Context): def ui_image( canUseLargeTextures: bool, - layout: bpy.types.UILayout, - material: bpy.types.Material, + layout: UILayout, + material: Material, textureProp: TextureProperty, name: str, showCheckBox: bool, @@ -2530,7 +2536,7 @@ def ui_image( high.prop(textureProp.T, "high", text="T High") -class CombinerProperty(bpy.types.PropertyGroup): +class CombinerProperty(PropertyGroup): A: bpy.props.EnumProperty( name="A", description="A", @@ -2608,7 +2614,7 @@ class CombinerProperty(bpy.types.PropertyGroup): ) -class ProceduralAnimProperty(bpy.types.PropertyGroup): +class ProceduralAnimProperty(PropertyGroup): speed: bpy.props.FloatProperty(name="Speed", default=1) amplitude: bpy.props.FloatProperty(name="Amplitude", default=1) frequency: bpy.props.FloatProperty(name="Frequency", default=1) @@ -2632,7 +2638,7 @@ class ProceduralAnimProperty(bpy.types.PropertyGroup): ) -class ProcAnimVectorProperty(bpy.types.PropertyGroup): +class ProcAnimVectorProperty(PropertyGroup): x: bpy.props.PointerProperty(type=ProceduralAnimProperty) y: bpy.props.PointerProperty(type=ProceduralAnimProperty) z: bpy.props.PointerProperty(type=ProceduralAnimProperty) @@ -2651,7 +2657,7 @@ class ProcAnimVectorProperty(bpy.types.PropertyGroup): ) -class PrimDepthSettings(bpy.types.PropertyGroup): +class PrimDepthSettings(PropertyGroup): z: bpy.props.IntProperty( name="Prim Depth: Z", default=0, @@ -2682,7 +2688,7 @@ class PrimDepthSettings(bpy.types.PropertyGroup): return (self.z, self.dz) -class RDPSettings(bpy.types.PropertyGroup): +class RDPSettings(PropertyGroup): g_zbuffer: bpy.props.BoolProperty( name="Z Buffer", default=True, @@ -3078,7 +3084,7 @@ class RDPSettings(bpy.types.PropertyGroup): ) -class DefaultRDPSettingsPanel(bpy.types.Panel): +class DefaultRDPSettingsPanel(Panel): bl_label = "RDP Default Settings" bl_idname = "WORLD_PT_RDP_Default_Inspector" bl_space_type = "PROPERTIES" @@ -3324,7 +3330,7 @@ class AddPresetF3D(AddPresetBase, Operator): def rna_recursive_attr_expand(value, rna_path_step, level): if rna_path_step in self.ignore_props: return - if isinstance(value, bpy.types.PropertyGroup): + if isinstance(value, PropertyGroup): for sub_value_attr in value.bl_rna.properties.keys(): if sub_value_attr == "rna_type": continue @@ -3494,7 +3500,7 @@ def convertToNewMat(material, oldMat): old_light = oldMat.get(f"f3d_light{str(i)}") # can be a broken property with V1 materials (IDPropertyGroup), thankfully this isnt typical to see when upgrading but # this method is safer - if type(old_light) is bpy.types.Light: + if type(old_light) is Light: setattr(material.f3d_mat, f"f3d_light{str(i)}", old_light) # Fog Properties @@ -3513,7 +3519,7 @@ def convertToNewMat(material, oldMat): recursiveCopyOldPropertyGroup(oldMat["rdp_settings"], material.f3d_mat.rdp_settings) -class F3DMaterialProperty(bpy.types.PropertyGroup): +class F3DMaterialProperty(PropertyGroup): presetName: bpy.props.StringProperty( name="Preset Name", default="Custom", @@ -3721,13 +3727,13 @@ class F3DMaterialProperty(bpy.types.PropertyGroup): default=(0.5, 0.5, 0.5, 1), update=update_light_properties, ) - f3d_light1: bpy.props.PointerProperty(type=bpy.types.Light, update=F3DOrganizeLights) - f3d_light2: bpy.props.PointerProperty(type=bpy.types.Light, update=F3DOrganizeLights) - f3d_light3: bpy.props.PointerProperty(type=bpy.types.Light, update=F3DOrganizeLights) - f3d_light4: bpy.props.PointerProperty(type=bpy.types.Light, update=F3DOrganizeLights) - f3d_light5: bpy.props.PointerProperty(type=bpy.types.Light, update=F3DOrganizeLights) - f3d_light6: bpy.props.PointerProperty(type=bpy.types.Light, update=F3DOrganizeLights) - f3d_light7: bpy.props.PointerProperty(type=bpy.types.Light, update=F3DOrganizeLights) + f3d_light1: bpy.props.PointerProperty(type=Light, update=F3DOrganizeLights) + f3d_light2: bpy.props.PointerProperty(type=Light, update=F3DOrganizeLights) + f3d_light3: bpy.props.PointerProperty(type=Light, update=F3DOrganizeLights) + f3d_light4: bpy.props.PointerProperty(type=Light, update=F3DOrganizeLights) + f3d_light5: bpy.props.PointerProperty(type=Light, update=F3DOrganizeLights) + f3d_light6: bpy.props.PointerProperty(type=Light, update=F3DOrganizeLights) + f3d_light7: bpy.props.PointerProperty(type=Light, update=F3DOrganizeLights) # Ambient Occlusion ao_ambient: bpy.props.FloatProperty( @@ -3881,7 +3887,7 @@ class F3DMaterialProperty(bpy.types.PropertyGroup): ) -class UnlinkF3DImage0(bpy.types.Operator): +class UnlinkF3DImage0(Operator): bl_idname = "image.tex0_unlink" bl_label = "Unlink F3D Image" bl_options = {"REGISTER", "UNDO", "PRESET"} @@ -3893,7 +3899,7 @@ class UnlinkF3DImage0(bpy.types.Operator): return {"FINISHED"} # must return a set -class UnlinkF3DImage1(bpy.types.Operator): +class UnlinkF3DImage1(Operator): bl_idname = "image.tex1_unlink" bl_label = "Unlink F3D Image" bl_options = {"REGISTER", "UNDO", "PRESET"} @@ -3905,7 +3911,7 @@ class UnlinkF3DImage1(bpy.types.Operator): return {"FINISHED"} # must return a set -class UpdateF3DNodes(bpy.types.Operator): +class UpdateF3DNodes(Operator): bl_idname = "material.update_f3d_nodes" bl_label = "Update F3D Nodes" bl_options = {"REGISTER", "UNDO", "PRESET"} @@ -3932,7 +3938,7 @@ class UpdateF3DNodes(bpy.types.Operator): return {"FINISHED"} # must return a set -class F3DRenderSettingsPanel(bpy.types.Panel): +class F3DRenderSettingsPanel(Panel): bl_label = "F3D Render Settings" bl_idname = "OBJECT_PT_F3D_RENDER_SETTINGS_PANEL" bl_space_type = "VIEW_3D" @@ -4014,7 +4020,7 @@ class F3DRenderSettingsPanel(bpy.types.Panel): def draw_f3d_render_settings(self, context): - layout: bpy.types.UILayout = self.layout + layout: UILayout = self.layout layout.popover(F3DRenderSettingsPanel.bl_idname) @@ -4079,12 +4085,12 @@ def mat_register(): savePresets() - bpy.types.Scene.f3d_type = bpy.props.EnumProperty( + Scene.f3d_type = bpy.props.EnumProperty( name="F3D Microcode", items=enumF3D, default="F3D", ) - bpy.types.Scene.isHWv1 = bpy.props.BoolProperty( + Scene.isHWv1 = bpy.props.BoolProperty( name="Is Hardware v1?", default=False, description=( @@ -4095,53 +4101,53 @@ def mat_register(): ) # RDP Defaults - bpy.types.World.rdp_defaults = bpy.props.PointerProperty(type=RDPSettings) - bpy.types.World.menu_geo = bpy.props.BoolProperty() - bpy.types.World.menu_upper = bpy.props.BoolProperty() - bpy.types.World.menu_lower = bpy.props.BoolProperty() - bpy.types.World.menu_other = bpy.props.BoolProperty() - bpy.types.World.menu_layers = bpy.props.BoolProperty() + World.rdp_defaults = bpy.props.PointerProperty(type=RDPSettings) + World.menu_geo = bpy.props.BoolProperty() + World.menu_upper = bpy.props.BoolProperty() + World.menu_lower = bpy.props.BoolProperty() + World.menu_other = bpy.props.BoolProperty() + World.menu_layers = bpy.props.BoolProperty() - bpy.types.Material.is_f3d = bpy.props.BoolProperty() - bpy.types.Material.mat_ver = bpy.props.IntProperty(default=1) - bpy.types.Material.f3d_update_flag = bpy.props.BoolProperty() - bpy.types.Material.f3d_mat = bpy.props.PointerProperty(type=F3DMaterialProperty) - bpy.types.Material.menu_tab = bpy.props.EnumProperty(items=enumF3DMenu) + Material.is_f3d = bpy.props.BoolProperty() + Material.mat_ver = bpy.props.IntProperty(default=1) + Material.f3d_update_flag = bpy.props.BoolProperty() + Material.f3d_mat = bpy.props.PointerProperty(type=F3DMaterialProperty) + Material.menu_tab = bpy.props.EnumProperty(items=enumF3DMenu) - bpy.types.Scene.f3dUserPresetsOnly = bpy.props.BoolProperty(name="User Presets Only") - bpy.types.Scene.f3d_simple = bpy.props.BoolProperty(name="Display Simple", default=True) + Scene.f3dUserPresetsOnly = bpy.props.BoolProperty(name="User Presets Only") + Scene.f3d_simple = bpy.props.BoolProperty(name="Display Simple", default=True) - bpy.types.Object.use_f3d_culling = bpy.props.BoolProperty( + Object.use_f3d_culling = bpy.props.BoolProperty( name="Enable Culling (Applies to F3DEX and up)", default=True, ) - bpy.types.Object.ignore_render = bpy.props.BoolProperty(name="Ignore Render") - bpy.types.Object.ignore_collision = bpy.props.BoolProperty(name="Ignore Collision") - bpy.types.Object.f3d_lod_z = bpy.props.IntProperty( + Object.ignore_render = bpy.props.BoolProperty(name="Ignore Render") + Object.ignore_collision = bpy.props.BoolProperty(name="Ignore Collision") + Object.f3d_lod_z = bpy.props.IntProperty( name="F3D LOD Z", min=1, default=10, ) - bpy.types.Object.f3d_lod_always_render_farthest = bpy.props.BoolProperty(name="Always Render Farthest LOD") + Object.f3d_lod_always_render_farthest = bpy.props.BoolProperty(name="Always Render Farthest LOD") - bpy.types.VIEW3D_HT_header.append(draw_f3d_render_settings) + VIEW3D_HT_header.append(draw_f3d_render_settings) def mat_unregister(): - bpy.types.VIEW3D_HT_header.remove(draw_f3d_render_settings) + VIEW3D_HT_header.remove(draw_f3d_render_settings) - del bpy.types.Material.menu_tab - del bpy.types.Material.f3d_mat - del bpy.types.Material.is_f3d - del bpy.types.Material.mat_ver - del bpy.types.Material.f3d_update_flag - del bpy.types.Scene.f3d_simple - del bpy.types.Object.ignore_render - del bpy.types.Object.ignore_collision - del bpy.types.Object.use_f3d_culling - del bpy.types.Scene.f3dUserPresetsOnly - del bpy.types.Object.f3d_lod_z - del bpy.types.Object.f3d_lod_always_render_farthest + del Material.menu_tab + del Material.f3d_mat + del Material.is_f3d + del Material.mat_ver + del Material.f3d_update_flag + del Scene.f3d_simple + del Object.ignore_render + del Object.ignore_collision + del Object.use_f3d_culling + del Scene.f3dUserPresetsOnly + del Object.f3d_lod_z + del Object.f3d_lod_always_render_farthest for cls in reversed(mat_classes): unregister_class(cls) diff --git a/fast64_internal/f3d/f3d_parser.py b/fast64_internal/f3d/f3d_parser.py index 031eeb1..57b9532 100644 --- a/fast64_internal/f3d/f3d_parser.py +++ b/fast64_internal/f3d/f3d_parser.py @@ -1582,10 +1582,10 @@ class F3DContext: mat.fresnel_hi = (1.0 / scale) + offset mat.set_fresnel = True elif command.name == "gsSPAttrOffsetST": - mat.attroffs_st = [from_s16_str(command.params[0]) / 32, from_s16_str(command.params[1]) / 32] + mat.attroffs_st = [int_from_s16_str(command.params[0]) / 32, int_from_s16_str(command.params[1]) / 32] mat.set_attroffs_st = True elif command.name == "gsSPAttrOffsetZ": - mat.attroffs_z = from_s16_str(command.params[0]) + mat.attroffs_z = int_from_s16_str(command.params[0]) mat.set_attroffs_z = True elif command.name == "gsSPFogFactor": pass diff --git a/fast64_internal/oot/oot_level_classes.py b/fast64_internal/oot/oot_level_classes.py index 185d03f..3f188f0 100644 --- a/fast64_internal/oot/oot_level_classes.py +++ b/fast64_internal/oot/oot_level_classes.py @@ -211,7 +211,7 @@ class OOTScene(OOTCommonCommands): def addRoom(self, roomIndex, roomName, roomShape): roomModel = self.model.addSubModel( - OOTModel(self.model.f3d.F3D_VER, self.model.f3d._HW_VERSION_1, roomName + "_dl", self.model.DLFormat, None) + OOTModel(roomName + "_dl", self.model.DLFormat, None) ) room = OOTRoom(roomIndex, roomName, roomModel, roomShape) if roomIndex in self.rooms: diff --git a/fast64_internal/utility.py b/fast64_internal/utility.py index 50c63c9..6654118 100644 --- a/fast64_internal/utility.py +++ b/fast64_internal/utility.py @@ -2,7 +2,7 @@ import bpy, random, string, os, math, traceback, re, os, mathutils, ast, operato from math import pi, ceil, degrees, radians, copysign from mathutils import * from .utility_anim import * -from typing import Callable, Iterable, Any +from typing import Callable, Iterable, Any, Tuple CollectionProperty = Any # collection prop as defined by using bpy.props.CollectionProperty @@ -600,15 +600,15 @@ to_s16 = lambda x: cast_integer(round(x), 16, True) radians_to_s16 = lambda d: to_s16(d * 0x10000 / (2 * math.pi)) -def from_s16(value: int): +def int_from_s16(value: int) -> int: value &= 0xFFFF if value >= 0x8000: value -= 0x10000 return value -def from_s16_str(value: str): - return from_s16(int(value, 0)) +def int_from_s16_str(value: str) -> int: + return int_from_s16(int(value, 0)) def decompFolderMessage(layout): @@ -1436,15 +1436,15 @@ def normToSigned8Vector(normal): return [int.from_bytes(int(value * 127).to_bytes(1, "big", signed=True), "big") for value in normal] -def unpackNormalS8(packedNormal): +def unpackNormalS8(packedNormal: int) -> Tuple[int, int, int]: assert isinstance(packedNormal, int) and packedNormal >= 0 and packedNormal <= 0xFFFF xo, yo = packedNormal >> 8, packedNormal & 0xFF # This is following the instructions in F3DEX3 x, y = xo & 0x7F, yo & 0x7F z = x + y zNeg = bool(z & 0x80) - x2, y2 = x ^ 0x7F, y ^ 0x7F # 7F - x, 7F - y - z = z ^ 0x7F # = 7F - x - y + x2, y2 = x ^ 0x7F, y ^ 0x7F # this is actually producing 7F - x, 7F - y + z = z ^ 0x7F # 7F - x - y; using xor saves an instruction and a register on the RSP if zNeg: x, y = x2, y2 x, y = -x if xo & 0x80 else x, -y if yo & 0x80 else y @@ -1453,12 +1453,12 @@ def unpackNormalS8(packedNormal): return x, y, z -def unpackNormal(packedNormal): +def unpackNormal(packedNormal: int) -> Vector: # Convert constant-L1 norm to standard L2 norm return Vector(unpackNormalS8(packedNormal)).normalized() -def packNormal(normal): +def packNormal(normal: Vector) -> int: # Convert standard normal to constant-L1 normal assert len(normal) == 3 l1norm = abs(normal[0]) + abs(normal[1]) + abs(normal[2]) @@ -1474,11 +1474,13 @@ def packNormal(normal): x, y = 0x7F - x, 0x7F - y x, y = x | xsign, y | ysign packedNormal = x << 8 | y + # The only error is in the float to int rounding above. The packing and unpacking + # will precisely restore the original int values. assert (xo, yo, zo) == unpackNormalS8(packedNormal) return packedNormal -def getRgbNormalSettings(f3d_mat): +def getRgbNormalSettings(f3d_mat: "F3DMaterialProperty") -> Tuple[bool, bool, bool]: rdp_settings = f3d_mat.rdp_settings has_packed_normals = bpy.context.scene.f3d_type == "F3DEX3" has_rgb = not rdp_settings.g_lighting or (has_packed_normals and rdp_settings.g_packed_normals) From 2fe441f8a38ed245d69a15512262cc48161e4a65 Mon Sep 17 00:00:00 2001 From: Sauraen Date: Mon, 16 Oct 2023 21:43:47 -0700 Subject: [PATCH 28/74] Additional type hints --- fast64_internal/f3d/f3d_material.py | 6 +++--- fast64_internal/f3d/f3d_writer.py | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/fast64_internal/f3d/f3d_material.py b/fast64_internal/f3d/f3d_material.py index 4f70b40..b458f13 100644 --- a/fast64_internal/f3d/f3d_material.py +++ b/fast64_internal/f3d/f3d_material.py @@ -420,7 +420,7 @@ def ui_geo_mode(settings, dataHolder, layout, useDropdown): ) if not useDropdown or dataHolder.menu_geo: - def indentGroup(parent, textOrProp, isText: bool): + def indentGroup(parent: UILayout, textOrProp: Union[str, F3DMaterialProperty], isText: bool) -> UILayout: c = parent.column(align=True) if isText: c.label(text=textOrProp) @@ -868,7 +868,7 @@ class F3DPanel(Panel): elif context.scene.gameEditorMode == "OOT": prop_split(layout, material.f3d_mat.draw_layer, "oot", "Draw Layer") - def ui_misc(self, f3dMat, inputCol, showCheckBox): + def ui_misc(self, f3dMat: F3DMaterialProperty, inputCol: UILayout, showCheckBox: bool) -> None: if f3dMat.rdp_settings.g_ambocclusion: if showCheckBox or f3dMat.set_ao: inputGroup = inputCol.column() @@ -916,7 +916,7 @@ class F3DPanel(Panel): prop_split(inputGroup.row(), f3dMat, "fog_color", "Fog Color") prop_split(inputGroup.row(), f3dMat, "fog_position", "Fog Range") - def checkDrawLayersWarnings(self, f3dMat, useDict, layout): + def checkDrawLayersWarnings(self, f3dMat: F3DMaterialProperty, useDict: Dict[str: bool], layout: UILayout): settings = f3dMat.rdp_settings isF3DEX3 = bpy.context.scene.f3d_type == "F3DEX3" lightFxPrereq = isF3DEX3 and settings.g_lighting diff --git a/fast64_internal/f3d/f3d_writer.py b/fast64_internal/f3d/f3d_writer.py index 754a43c..ad18f1e 100644 --- a/fast64_internal/f3d/f3d_writer.py +++ b/fast64_internal/f3d/f3d_writer.py @@ -1,4 +1,4 @@ -from typing import Union, Optional +from typing import Union, Optional, Callable, Any from dataclasses import dataclass import functools import bpy, mathutils, os, re, copy, math @@ -961,7 +961,7 @@ def getF3DVert(loop: bpy.types.MeshLoop, face, convertInfo: LoopConvertInfo, mes return F3DVert(position, uv, rgb, normal, alpha) -def getLoopNormal(loop: bpy.types.MeshLoop): +def getLoopNormal(loop: bpy.types.MeshLoop) -> Vector: # Have to quantize to something because F3DVerts will be compared, and we # don't want floating-point inaccuracy causing "same" vertices not to be # merged. But, it hasn't been transformed yet, so quantizing to s8 here will @@ -980,7 +980,7 @@ def is3_2_or_above(): return bpy.app.version[0] >= 3 and bpy.app.version[1] >= 2 -def getLoopColor(loop: bpy.types.MeshLoop, mesh): +def getLoopColor(loop: bpy.types.MeshLoop, mesh: bpy.types.Mesh) -> Vector: color_layer = getColorLayer(mesh, layer="Col") alpha_layer = getColorLayer(mesh, layer="Alpha") @@ -1367,7 +1367,7 @@ def saveBitGeo(value, defaultValue, flagName, setGeo, clearGeo, matWriteMethod): clearGeo.flagList.append(flagName) -def saveGeoModeCommon(saveFunc, settings, defaults, args): +def saveGeoModeCommon(saveFunc: Callable, settings: RDPSettings, defaults: RDPSettings, args: Any): saveFunc(settings.g_zbuffer, defaults.g_zbuffer, "G_ZBUFFER", *args) saveFunc(settings.g_shade, defaults.g_shade, "G_SHADE", *args) saveFunc(settings.g_cull_front, defaults.g_cull_front, "G_CULL_FRONT", *args) From 20e214948694f712ab44ddc0358c59d3f581140a Mon Sep 17 00:00:00 2001 From: Sauraen Date: Mon, 16 Oct 2023 21:44:55 -0700 Subject: [PATCH 29/74] blacked --- fast64_internal/f3d/f3d_material.py | 46 ++++++++++++++---------- fast64_internal/f3d/f3d_parser.py | 5 ++- fast64_internal/oot/oot_level_classes.py | 4 +-- 3 files changed, 33 insertions(+), 22 deletions(-) diff --git a/fast64_internal/f3d/f3d_material.py b/fast64_internal/f3d/f3d_material.py index b458f13..605f803 100644 --- a/fast64_internal/f3d/f3d_material.py +++ b/fast64_internal/f3d/f3d_material.py @@ -1,11 +1,29 @@ import logging import bpy, math, os from bpy.types import ( - Attribute, Context, Image, Light, Material, - Menu, Mesh, NodeGroupOutput, NodeInputs, NodeLink, NodeSocket, - NodeTree, Object, Operator, Panel, Property, - PropertyGroup, Scene, ShaderNodeGroup, TextureNodeImage, - UILayout, VIEW3D_HT_header, World + Attribute, + Context, + Image, + Light, + Material, + Menu, + Mesh, + NodeGroupOutput, + NodeInputs, + NodeLink, + NodeSocket, + NodeTree, + Object, + Operator, + Panel, + Property, + PropertyGroup, + Scene, + ShaderNodeGroup, + TextureNodeImage, + UILayout, + VIEW3D_HT_header, + World, ) from bl_operators.presets import AddPresetBase from bpy.utils import register_class, unregister_class @@ -159,7 +177,7 @@ def update_draw_layer(self, context): set_output_node_groups(material) -def all_blender_uses(rdp_settings: "RDPSettings") -> Dict[str: bool]: +def all_blender_uses(rdp_settings: "RDPSettings") -> Dict[str:bool]: """ Returns a dictionary of the external features which the blender may or may not use, or None if set_rendermode is disabled so we don't know. @@ -851,11 +869,7 @@ class F3DPanel(Panel): renderGroup.enabled = material.rdp_settings.set_rendermode def ui_uvCheck(self, layout, context): - if ( - hasattr(context, "object") - and context.object is not None - and isinstance(context.object.data, Mesh) - ): + if hasattr(context, "object") and context.object is not None and isinstance(context.object.data, Mesh): uv_layers = context.object.data.uv_layers if uv_layers.active is None or uv_layers.active.name != "UVMap": uvErrorBox = layout.box() @@ -916,7 +930,7 @@ class F3DPanel(Panel): prop_split(inputGroup.row(), f3dMat, "fog_color", "Fog Color") prop_split(inputGroup.row(), f3dMat, "fog_position", "Fog Range") - def checkDrawLayersWarnings(self, f3dMat: F3DMaterialProperty, useDict: Dict[str: bool], layout: UILayout): + def checkDrawLayersWarnings(self, f3dMat: F3DMaterialProperty, useDict: Dict[str:bool], layout: UILayout): settings = f3dMat.rdp_settings isF3DEX3 = bpy.context.scene.f3d_type == "F3DEX3" lightFxPrereq = isF3DEX3 and settings.g_lighting @@ -1436,9 +1450,7 @@ def update_noise_nodes(material: Material): nodes["F3DNoiseFactor"].node_tree = noise_group -def update_combiner_connections( - material: Material, context: Context, combiner: (int | None) = None -): +def update_combiner_connections(material: Material, context: Context, combiner: (int | None) = None): f3dMat: "F3DMaterialProperty" = material.f3d_mat update_noise_nodes(material) @@ -1647,9 +1659,7 @@ def trunc_10_2(val: float): return int(val * 4) / 4 -def update_tex_values_field( - self: Material, texProperty: "TextureProperty", tex_size: list[int], tex_index: int -): +def update_tex_values_field(self: Material, texProperty: "TextureProperty", tex_size: list[int], tex_index: int): nodes = self.node_tree.nodes textureSettings: ShaderNodeGroup = nodes["TextureSettings"] inputs = textureSettings.inputs diff --git a/fast64_internal/f3d/f3d_parser.py b/fast64_internal/f3d/f3d_parser.py index 57b9532..d14dd50 100644 --- a/fast64_internal/f3d/f3d_parser.py +++ b/fast64_internal/f3d/f3d_parser.py @@ -1582,7 +1582,10 @@ class F3DContext: mat.fresnel_hi = (1.0 / scale) + offset mat.set_fresnel = True elif command.name == "gsSPAttrOffsetST": - mat.attroffs_st = [int_from_s16_str(command.params[0]) / 32, int_from_s16_str(command.params[1]) / 32] + mat.attroffs_st = [ + int_from_s16_str(command.params[0]) / 32, + int_from_s16_str(command.params[1]) / 32, + ] mat.set_attroffs_st = True elif command.name == "gsSPAttrOffsetZ": mat.attroffs_z = int_from_s16_str(command.params[0]) diff --git a/fast64_internal/oot/oot_level_classes.py b/fast64_internal/oot/oot_level_classes.py index 3f188f0..b26695c 100644 --- a/fast64_internal/oot/oot_level_classes.py +++ b/fast64_internal/oot/oot_level_classes.py @@ -210,9 +210,7 @@ class OOTScene(OOTCommonCommands): count = count + 1 def addRoom(self, roomIndex, roomName, roomShape): - roomModel = self.model.addSubModel( - OOTModel(roomName + "_dl", self.model.DLFormat, None) - ) + roomModel = self.model.addSubModel(OOTModel(roomName + "_dl", self.model.DLFormat, None)) room = OOTRoom(roomIndex, roomName, roomModel, roomShape) if roomIndex in self.rooms: raise PluginError("Repeat room index " + str(roomIndex) + " for " + str(roomName)) From e62c4057f2518d0d370fc09ca09bcec90feee135 Mon Sep 17 00:00:00 2001 From: Sauraen Date: Mon, 16 Oct 2023 22:02:31 -0700 Subject: [PATCH 30/74] Fixed some missing F3DEX3 checks --- fast64_internal/f3d/f3d_parser.py | 45 ++++++++++++++++++------------- 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/fast64_internal/f3d/f3d_parser.py b/fast64_internal/f3d/f3d_parser.py index d14dd50..d667dcd 100644 --- a/fast64_internal/f3d/f3d_parser.py +++ b/fast64_internal/f3d/f3d_parser.py @@ -880,18 +880,19 @@ class F3DContext: mat.rdp_settings.g_cull_front = value if bitFlags & self.f3d.G_CULL_BACK: mat.rdp_settings.g_cull_back = value - if bitFlags & self.f3d.G_ATTROFFSET_ST_ENABLE: - mat.rdp_settings.g_attroffset_st_enable = value - if bitFlags & self.f3d.G_ATTROFFSET_Z_ENABLE: - mat.rdp_settings.g_attroffset_z_enable = value - if bitFlags & self.f3d.G_PACKED_NORMALS: - mat.rdp_settings.g_packed_normals = value - if bitFlags & self.f3d.G_LIGHTTOALPHA: - mat.rdp_settings.g_lighttoalpha = value - if bitFlags & self.f3d.G_AMBOCCLUSION: - mat.rdp_settings.g_ambocclusion = value - if bitFlags & self.f3d.G_FRESNEL: - mat.rdp_settings.g_fresnel = value + if self.f3d.F3DEX_GBI_3: + if bitFlags & self.f3d.G_ATTROFFSET_ST_ENABLE: + mat.rdp_settings.g_attroffset_st_enable = value + if bitFlags & self.f3d.G_ATTROFFSET_Z_ENABLE: + mat.rdp_settings.g_attroffset_z_enable = value + if bitFlags & self.f3d.G_PACKED_NORMALS: + mat.rdp_settings.g_packed_normals = value + if bitFlags & self.f3d.G_LIGHTTOALPHA: + mat.rdp_settings.g_lighttoalpha = value + if bitFlags & self.f3d.G_AMBOCCLUSION: + mat.rdp_settings.g_ambocclusion = value + if bitFlags & self.f3d.G_FRESNEL: + mat.rdp_settings.g_fresnel = value if bitFlags & self.f3d.G_FOG: mat.rdp_settings.g_fog = value if bitFlags & self.f3d.G_LIGHTING: @@ -916,12 +917,20 @@ class F3DContext: mat.rdp_settings.g_shade = bitFlags & self.f3d.G_SHADE != 0 mat.rdp_settings.g_cull_front = bitFlags & self.f3d.G_CULL_FRONT != 0 mat.rdp_settings.g_cull_back = bitFlags & self.f3d.G_CULL_BACK != 0 - mat.rdp_settings.g_attroffset_st_enable = bitFlags & self.f3d.G_ATTROFFSET_ST_ENABLE != 0 - mat.rdp_settings.g_attroffset_z_enable = bitFlags & self.f3d.G_ATTROFFSET_Z_ENABLE != 0 - mat.rdp_settings.g_packed_normals = bitFlags & self.f3d.G_PACKED_NORMALS != 0 - mat.rdp_settings.g_lighttoalpha = bitFlags & self.f3d.G_LIGHTTOALPHA != 0 - mat.rdp_settings.g_ambocclusion = bitFlags & self.f3d.G_AMBOCCLUSION != 0 - mat.rdp_settings.g_fresnel = bitFlags & self.f3d.G_FRESNEL != 0 + if self.f3d.F3DEX_GBI_3: + mat.rdp_settings.g_attroffset_st_enable = bitFlags & self.f3d.G_ATTROFFSET_ST_ENABLE != 0 + mat.rdp_settings.g_attroffset_z_enable = bitFlags & self.f3d.G_ATTROFFSET_Z_ENABLE != 0 + mat.rdp_settings.g_packed_normals = bitFlags & self.f3d.G_PACKED_NORMALS != 0 + mat.rdp_settings.g_lighttoalpha = bitFlags & self.f3d.G_LIGHTTOALPHA != 0 + mat.rdp_settings.g_ambocclusion = bitFlags & self.f3d.G_AMBOCCLUSION != 0 + mat.rdp_settings.g_fresnel = bitFlags & self.f3d.G_FRESNEL != 0 + else: + mat.rdp_settings.g_attroffset_st_enable = False + mat.rdp_settings.g_attroffset_z_enable = False + mat.rdp_settings.g_packed_normals = False + mat.rdp_settings.g_lighttoalpha = False + mat.rdp_settings.g_ambocclusion = False + mat.rdp_settings.g_fresnel = False mat.rdp_settings.g_fog = bitFlags & self.f3d.G_FOG != 0 mat.rdp_settings.g_lighting = bitFlags & self.f3d.G_LIGHTING != 0 mat.rdp_settings.g_tex_gen = bitFlags & self.f3d.G_TEXTURE_GEN != 0 From b388056b993750965a9ad2c8a87baa33b03b3794 Mon Sep 17 00:00:00 2001 From: Yanis42 <35189056+Yanis42@users.noreply.github.com> Date: Wed, 18 Oct 2023 09:11:47 +0200 Subject: [PATCH 31/74] [OOT] Adapted zcamedit to Fast64 (#235) * merged zcamedit by sauraen * black * import cleanup * props, ops and panels split * import/export split * created ``utility.py`` * import errors fix * removed ActionData.py * preview renames and removed useless functions * minor import changes * moved constants outside cfileio * code cleanup start * black * exporter cleanup * importer cleanup * forgot a file * operators cleanup * panel cleanup * preview cleanup * black * utility cleanup * black * renames * moved zcamedit to cutscene folder * fixes, moved properties to classes, upgrade system * fixes * upgrade fixes * black * moved preveiw age prop * prop renames, empty types and ui stuff * search box for cue cmd type * removed debug print * merged init cs op with add cs * tweaks * accurate names * player cue and added endframe for actor/player cues * cuepoint -> cue * new exporter part 1 * export part 2 * black * camera initial export * fixed continue flag * bugfix * more fixes * decomp features toggle * small export cleanup * new importer part 1 * new importer part 2 * fixes * fixes and minor cleanup * new importer part 3 * safety checks * io fixes * import cleanup * moved obj factory to io_classes, improved parenting * moved the new importer * minor fixes * check params * another safety check * new cutscene parser * cutscene integration for scene importer * insert feature + exporter tweaks * comments * docs * fixed actor cues * some export fixes * fixed oddity * cleanup pass * black * updated actor cue + list and camera shot ops * add bone operator * black * small cleanup * preview * bugfix, add bone * more fixes * fixed camera shot creation not working * avoid creating pointless cue preview * lock cs to origin to avoid issues (not definitive) * prompt for cs name * show camera motion preview op * removed preset option from add cs op * upgrade fixes * some cue preview improvements * support for "stop cs" misc cmd for imported cs * add a poll when choosing cs object in scene export * cutscene transition/misc preview (#2) * transition preview 1.0 * fixed node issue * sepia/black & white preview * set locked viewpoint & usenode toggle * node fix * fixed lag issue & pulsating red light misc cmd * better stop cs * cleanup * black * fixes * fixes and improvements * manual clear transform * add cs to scene * black * bone desync fix * review * fixed create preview not assigning the object to preview * minor improvements * XML parse cutscene enums (+ misc ones) * wip widescreen/letterbox mode * sort cues by starting frame on export * fixed minor importer issue * small fixes * fix minor export issues * fixed player defaulting to custom --- fast64_internal/oot/README.md | 43 +- fast64_internal/oot/__init__.py | 18 + .../oot/cutscene/motion/constants.py | 92 +++ .../oot/cutscene/motion/exporter/__init__.py | 1 + .../oot/cutscene/motion/exporter/classes.py | 272 +++++++++ .../oot/cutscene/motion/exporter/functions.py | 46 ++ .../oot/cutscene/motion/importer/__init__.py | 1 + .../oot/cutscene/motion/importer/classes.py | 559 ++++++++++++++++++ .../oot/cutscene/motion/importer/functions.py | 10 + .../oot/cutscene/motion/io_classes.py | 258 ++++++++ .../oot/cutscene/motion/operators.py | 371 ++++++++++++ fast64_internal/oot/cutscene/motion/panels.py | 50 ++ .../oot/cutscene/motion/preview.py | 220 +++++++ .../oot/cutscene/motion/properties.py | 277 +++++++++ .../oot/cutscene/motion/utility.py | 275 +++++++++ fast64_internal/oot/cutscene/operators.py | 121 +++- fast64_internal/oot/cutscene/panels.py | 55 +- fast64_internal/oot/cutscene/preview.py | 278 +++++++++ fast64_internal/oot/cutscene/properties.py | 71 ++- fast64_internal/oot/cutscene_docs.md | 106 ++++ fast64_internal/oot/data/oot_data.py | 2 + fast64_internal/oot/data/oot_enum_data.py | 92 +++ fast64_internal/oot/data/xml/EnumData.xml | 432 ++++++++++++++ fast64_internal/oot/oot_constants.py | 9 +- fast64_internal/oot/oot_level_parser.py | 22 +- fast64_internal/oot/oot_upgrade.py | 80 +++ fast64_internal/oot/oot_utility.py | 10 +- fast64_internal/oot/props_panel_main.py | 35 +- fast64_internal/oot/room/properties.py | 2 +- .../oot/scene/exporter/to_c/scene_commands.py | 2 +- .../oot/scene/exporter/to_c/scene_cutscene.py | 28 +- fast64_internal/oot/scene/properties.py | 21 +- fast64_internal/oot/tools/operators.py | 54 +- fast64_internal/oot/tools/panel.py | 3 + 34 files changed, 3865 insertions(+), 51 deletions(-) create mode 100644 fast64_internal/oot/cutscene/motion/constants.py create mode 100644 fast64_internal/oot/cutscene/motion/exporter/__init__.py create mode 100644 fast64_internal/oot/cutscene/motion/exporter/classes.py create mode 100644 fast64_internal/oot/cutscene/motion/exporter/functions.py create mode 100644 fast64_internal/oot/cutscene/motion/importer/__init__.py create mode 100644 fast64_internal/oot/cutscene/motion/importer/classes.py create mode 100644 fast64_internal/oot/cutscene/motion/importer/functions.py create mode 100644 fast64_internal/oot/cutscene/motion/io_classes.py create mode 100644 fast64_internal/oot/cutscene/motion/operators.py create mode 100644 fast64_internal/oot/cutscene/motion/panels.py create mode 100644 fast64_internal/oot/cutscene/motion/preview.py create mode 100644 fast64_internal/oot/cutscene/motion/properties.py create mode 100644 fast64_internal/oot/cutscene/motion/utility.py create mode 100644 fast64_internal/oot/cutscene/preview.py create mode 100644 fast64_internal/oot/cutscene_docs.md create mode 100644 fast64_internal/oot/data/oot_enum_data.py create mode 100644 fast64_internal/oot/data/xml/EnumData.xml diff --git a/fast64_internal/oot/README.md b/fast64_internal/oot/README.md index 69ba2e0..9e73267 100644 --- a/fast64_internal/oot/README.md +++ b/fast64_internal/oot/README.md @@ -1,5 +1,18 @@ # Ocarina Of Time +## Table of Contents +1. [Getting Started](#getting-started) +2. [Scene Overview](#scene-overview) +3. [Actors](#actors) +4. [Exits](#exits) +5. [Draw Config and Dynamic Material Properties](#scene-draw-configuration-and-dynamic-material-properties) +6. [Collision](#collision) +7. [Skeletons and Animations](#skeletons-and-animations) +8. [Flipbook Textures](#flipbook-textures) +9. [Custom Link Process](#custom-link-process) +10. [Custom Skeleton Mesh Process](#custom-skeleton-mesh-process) +11. [Cutscenes](#cutscenes) + ### Getting Started 1. In the 3D view properties sidebar, go to the ``Fast64`` tab, then ``Fast64 Global Settings`` and set ``Game`` to ``OOT``. 2. Set ``F3D Microcode`` to ``F3DEX2/LX2``. @@ -124,24 +137,19 @@ Heavy modifications of Links model can cause his matrices array to shift from wh 6. In the actor header file, (in src/overlays/actors/\/), set the joint/morph table sizes to be (number of bones + 1) 7. In the actor source file, this value should also be used for the limbCount argument in SkelAnime_InitFlex(). -### Creating a Cutscene +### Cutscenes +For more informations about cutscenes [click here](cutscene_docs.md) + **Creating the cutscene itself:** -To create custom cutscenes you need to get [zcamedit, made by Sauraen](https://github.com/sauraen/zcamedit). - -1. Start with using the ``Add Cutscene`` button from the OOT Panel. Name it ``Cutscene.YOUR_CS_NAME``, ``YOUR_CS_NAME`` being the name of your choice, it can be something like: ``Cutscene.fireTempleIntroCS``. Note that this object can't be parented to any object. -2. Select the cutscene empty object, then in the ``Object Properties`` panel click on ``Init Cutscene Empty``, then ``Create camera shot``. This will initialise the cutscene and add a basic camera shot with 4 bones. -3. Select the scene where you want to add the cutscene, and in the object properties go in the ``Cutscene`` tab then enable ``Write Cutscene``. In ``Data`` select ``Object`` and in ``Cutscene Object`` select the cutscene empty object you just created. -4. Now you need to create the camera shot. The ``Create camera shot`` button from the cutscene object's properties panel will add a basic shot that you can edit. To have a better idea of the position/angle of one point of the shot, you can change the display of the armature in the ``Object Data Properties`` panel (select the shot object first), choose ``Octahedral`` in ``Viewport Display`` then ``Display As``. -5. As mentioned in the zcamedit repository, the first and last bone of the shot won't be actual camera points, it defines the start and the end of a cutscene, this means with the basic shot you'll have only 2 actual camera points. Either duplicate (``SHIFT+D``) or add a new bone to add more camera points. -6. You can edit the position and rotation of each bone in the ``Edit Mode`` after selecting the shot object. The "tail" (less large point) of a bone is the direction, and "head" (larger point) is the origin. -7. When you're done with your cutscene, start with exporting your scene (you don't need to export it everytime). When this is done, select the cutscene object you want to export and use ``Export Cutscene`` from ``OOT Cutscene Exporter`` in the OOT panel. In the ``File`` field, you can choose the scene of your choice (note that it can export into actors too). +1. Start with using the ``Add Cutscene`` button from the OOT Panel. Name it ``Cutscene.YOUR_CS_NAME``, ``YOUR_CS_NAME`` being the name of your choice, it can be something like: ``Cutscene.fireTempleIntroCS``. Note that this object can't be parented to any object, also this will automatically create a new camera and it will also set the Blender scene's active camera to this one. +2. Select the scene where you want to add the cutscene, and in the object properties go in the ``Cutscene`` tab then enable ``Write Cutscene``. In ``Data`` select ``Object`` and in ``Cutscene Object`` select the cutscene empty object you just created. +3. Now you can create the camera shot. The ``Create Camera Shot`` button from the cutscene object's properties panel will add a basic shot with 4 bones that you can edit. To have a better idea of the position/angle of one point of the shot, you can change the display of the armature in the ``Object Data Properties`` panel (select the shot object first), choose ``Octahedral`` in ``Viewport Display`` then ``Display As``. +4. The first and last bone of the shot won't be actual camera points, it defines the start and the end of a camera shot, this means a basic shot will only have 2 actual camera points. Either duplicate (``SHIFT+D``) or add a new bone to add more camera points. Note that these points will be exported in the order you can see in the view layer. +5. You can edit the position and rotation of each bone in the ``Edit Mode`` after selecting the shot object. The "tail" (less large point) of a bone is the direction (the "look-at", or AT), and "head" (larger point) is the origin (the "eye"). +7. When you're done with your cutscene, exporting the scene will also export the camera shot and actor cue data. If you don't want to re-export the scene everytime, select the cutscene object you want to export and use ``Export Cutscene`` from ``OOT Cutscene Exporter`` in the OOT panel. In the ``File`` field, you can choose the scene of your choice (note that it can export into actors too). You can toggle the usage of decomp's names and macros with the ``Use Decomp for Export`` checkbox, you can also choose to insert the motion data in an existing cutscene (it will create a new array if it can't find it, it's based on the name of the object you selected). This is done by toggling the ``Export Motion Data Only`` checkbox. 8. Compile the game. -To get more informations about the game's cutscene system/camera system, read [zcamedit's readme](https://github.com/sauraen/zcamedit#setting-up-a-cutscene) - -Note: a "cutscene terminator" is a cutscene command that makes a scene transition. For example, this is used in the intro cutscene or in the credits. -

Armature Data Properties Panel @@ -171,3 +179,10 @@ Note that you can have the actual address of your cutscene if you use ``sym_info - Result: ``Symbol gHyruleFieldIntroCs (RAM: 0x02013AA0, ROM: 0x27E9AA0, build/assets/scenes/overworld/spot00/spot00_scene.o)`` If you have a softlock in-game then you probably did something wrong when creating the cutscene. Make sure you set up the bones properly. The softlock means the game is playing a cutscene but it's probably reading wrong data. Make sure the cutscene is exported, if it's not export it again. + +If the camera preview in Blender isn't following where you have the bones or if the cutscene sort of works in-game but the positions are all wrong: + +1. Make sure your scene empty object, room empty object, and cutscene empty object are all at the Blender origin. You can usually do this with a combination of Object > Clear > Origin and Alt+G. Maybe Object > Apply > All Transforms if that doesn't work. If your room empty object is 1 meter below your scene empty object, as fast64 does by default, that offset will be applied to everything in game and then the zcamedit stuff will not be at the correct relative position. + +2. If you moved / rotated / etc. one of the camera shots / armatures in object mode, this transformation will be ignored. You can fix this by selecting the shot / armature in object mode and clicking Object > Apply > All Transforms. That will convert the transform to actual changed positions for each bone. + diff --git a/fast64_internal/oot/__init__.py b/fast64_internal/oot/__init__.py index d9f19d7..ecd7b5f 100644 --- a/fast64_internal/oot/__init__.py +++ b/fast64_internal/oot/__init__.py @@ -37,6 +37,12 @@ from .animation.properties import ( from .cutscene.operators import cutscene_ops_register, cutscene_ops_unregister from .cutscene.properties import cutscene_props_register, cutscene_props_unregister from .cutscene.panels import cutscene_panels_register, cutscene_panels_unregister +from .cutscene.preview import cutscene_preview_register, cutscene_preview_unregister + +from .cutscene.motion.operators import csMotion_ops_register, csMotion_ops_unregister +from .cutscene.motion.properties import csMotion_props_register, csMotion_props_unregister +from .cutscene.motion.panels import csMotion_panels_register, csMotion_panels_unregister +from .cutscene.motion.preview import csMotion_preview_register, csMotion_preview_unregister from .skeleton.operators import skeleton_ops_register, skeleton_ops_unregister from .skeleton.properties import skeleton_props_register, skeleton_props_unregister @@ -121,6 +127,12 @@ def oot_register(registerPanels): file_register() anim_props_register() + csMotion_ops_register() + csMotion_props_register() + csMotion_panels_register() + csMotion_preview_register() + cutscene_preview_register() + for cls in oot_classes: register_class(cls) @@ -154,5 +166,11 @@ def oot_unregister(unregisterPanels): file_unregister() anim_props_unregister() + cutscene_preview_unregister() + csMotion_preview_unregister() + csMotion_panels_unregister() + csMotion_props_unregister() + csMotion_ops_unregister() + if unregisterPanels: oot_panel_unregister() diff --git a/fast64_internal/oot/cutscene/motion/constants.py b/fast64_internal/oot/cutscene/motion/constants.py new file mode 100644 index 0000000..236da19 --- /dev/null +++ b/fast64_internal/oot/cutscene/motion/constants.py @@ -0,0 +1,92 @@ +from ...oot_constants import ootData + +ootEnumCSMotionCamMode = [ + ("splineEyeOrAT", "Eye/AT Spline", "Eye/AT Spline"), + ("splineEyeOrATRelPlayer", "Spline Rel. Player", "Relative to Player's location/yaw"), + ("eyeOrAT", "Eye/AT Point", "Single Eye/AT point (not recommended)"), +] + +ootEnumCSActorCueListCommandType = [ + item for item in ootData.enumData.ootEnumCsCmd if "actor_cue" in item[0] or "player_cue" in item[0] +] +ootEnumCSActorCueListCommandType.sort() +ootEnumCSActorCueListCommandType.insert(0, ("Custom", "Custom", "Custom")) + +ootCSMotionLegacyToNewCmdNames = { + "CS_CAM_POS_LIST": "CS_CAM_EYE_SPLINE", + "CS_CAM_FOCUS_POINT_LIST": "CS_CAM_AT_SPLINE", + "CS_CAM_POS_PLAYER_LIST": "CS_CAM_EYE_SPLINE_REL_TO_PLAYER", + "CS_CAM_FOCUS_POINT_PLAYER_LIST": "CS_CAM_AT_SPLINE_REL_TO_PLAYER", + "CS_NPC_ACTION_LIST": "CS_ACTOR_CUE_LIST", + "CS_PLAYER_ACTION_LIST": "CS_PLAYER_CUE_LIST", + "CS_CMD_07": "CS_CAM_EYE", + "CS_CMD_08": "CS_CAM_AT", + "CS_CAM_POS": "CS_CAM_POINT", + "CS_CAM_FOCUS_POINT": "CS_CAM_POINT", + "CS_CAM_POS_PLAYER": "CS_CAM_POINT", + "CS_CAM_FOCUS_POINT_PLAYER": "CS_CAM_POINT", + "CS_NPC_ACTION": "CS_ACTOR_CUE", + "CS_PLAYER_ACTION": "CS_PLAYER_CUE", + "CS_CMD_09_LIST": "CS_RUMBLE_CONTROLLER_LIST", + "CS_CMD_09": "CS_RUMBLE_CONTROLLER", + "CS_TEXT_DISPLAY_TEXTBOX": "CS_TEXT", + "CS_TEXT_LEARN_SONG": "CS_TEXT_OCARINA_ACTION", + "CS_SCENE_TRANS_FX": "CS_TRANSITION", + "CS_FADE_BGM_LIST": "CS_FADE_OUT_SEQ_LIST", + "CS_FADE_BGM": "CS_FADE_OUT_SEQ", + "CS_TERMINATOR": "CS_DESTINATION", +} + +ootCSMotionListCommands = [ + "CS_ACTOR_CUE_LIST", + "CS_PLAYER_CUE_LIST", + "CS_CAM_EYE_SPLINE", + "CS_CAM_AT_SPLINE", + "CS_CAM_EYE_SPLINE_REL_TO_PLAYER", + "CS_CAM_AT_SPLINE_REL_TO_PLAYER", + "CS_CAM_EYE", + "CS_CAM_AT", + "CS_MISC_LIST", + "CS_LIGHT_SETTING_LIST", + "CS_RUMBLE_CONTROLLER_LIST", + "CS_TEXT_LIST", + "CS_START_SEQ_LIST", + "CS_STOP_SEQ_LIST", + "CS_FADE_OUT_SEQ_LIST", + "CS_TIME_LIST", + "CS_UNK_DATA_LIST", + "CS_PLAY_BGM_LIST", + "CS_STOP_BGM_LIST", + "CS_LIGHTING_LIST", +] + +ootCSMotionListEntryCommands = [ + "CS_ACTOR_CUE", + "CS_PLAYER_CUE", + "CS_CAM_POINT", + "CS_MISC", + "CS_LIGHT_SETTING", + "CS_RUMBLE_CONTROLLER", + "CS_TEXT", + "CS_TEXT_NONE", + "CS_TEXT_OCARINA_ACTION", + "CS_START_SEQ", + "CS_STOP_SEQ", + "CS_FADE_OUT_SEQ", + "CS_TIME", + "CS_UNK_DATA", + "CS_PLAY_BGM", + "CS_STOP_BGM", + "CS_LIGHTING", +] + +ootCSMotionSingleCommands = [ + "CS_BEGIN_CUTSCENE", + "CS_END", + "CS_TRANSITION", + "CS_DESTINATION", +] + +ootCSMotionListAndSingleCommands = ootCSMotionSingleCommands + ootCSMotionListCommands +ootCSMotionListAndSingleCommands.remove("CS_BEGIN_CUTSCENE") +ootCSMotionCSCommands = ootCSMotionSingleCommands + ootCSMotionListCommands + ootCSMotionListEntryCommands diff --git a/fast64_internal/oot/cutscene/motion/exporter/__init__.py b/fast64_internal/oot/cutscene/motion/exporter/__init__.py new file mode 100644 index 0000000..b4ff461 --- /dev/null +++ b/fast64_internal/oot/cutscene/motion/exporter/__init__.py @@ -0,0 +1 @@ +from .functions import getCutsceneMotionData diff --git a/fast64_internal/oot/cutscene/motion/exporter/classes.py b/fast64_internal/oot/cutscene/motion/exporter/classes.py new file mode 100644 index 0000000..67a3fea --- /dev/null +++ b/fast64_internal/oot/cutscene/motion/exporter/classes.py @@ -0,0 +1,272 @@ +import math +import bpy + +from dataclasses import dataclass +from bpy.types import Object +from .....utility import PluginError, indent +from ....oot_constants import ootData + +from ..io_classes import ( + OOTCSMotionActorCueList, + OOTCSMotionActorCue, + OOTCSMotionCamEyeSpline, + OOTCSMotionCamATSpline, + OOTCSMotionCamEyeSplineRelToPlayer, + OOTCSMotionCamATSplineRelToPlayer, + OOTCSMotionCamEye, + OOTCSMotionCamAT, + OOTCSMotionCamPoint, +) + + +class OOTCSMotionExportCommands: + """This class contains functions to create the cutscene commands""" + + def getActorCueListCmd(self, actorCueList: OOTCSMotionActorCueList, isPlayerActor: bool): + return indent + ( + f"CS_{'PLAYER' if isPlayerActor else 'ACTOR'}_CUE_LIST(" + + f"{actorCueList.commandType + ', ' if not isPlayerActor else ''}" + + f"{actorCueList.entryTotal}),\n" + ) + + def getActorCueCmd(self, actorCue: OOTCSMotionActorCue, isPlayerActor: bool): + return indent * 2 + ( + f"CS_{'PLAYER' if isPlayerActor else 'ACTOR'}_CUE(" + + f"{actorCue.actionID}, {actorCue.startFrame}, {actorCue.endFrame}, " + + "".join(f"{rot}, " for rot in actorCue.rot) + + "".join(f"{pos}, " for pos in actorCue.startPos) + + "".join(f"{pos}, " for pos in actorCue.endPos) + + "0.0f, 0.0f, 0.0f),\n" + ) + + def getCamListCmd(self, cmdName: str, startFrame: int, endFrame: int): + return indent + f"{cmdName}({startFrame}, {endFrame}),\n" + + def getCamEyeSplineCmd(self, camEyeSpline: OOTCSMotionCamEyeSpline): + return self.getCamListCmd("CS_CAM_EYE_SPLINE", camEyeSpline.startFrame, camEyeSpline.endFrame) + + def getCamATSplineCmd(self, camATSpline: OOTCSMotionCamATSpline): + return self.getCamListCmd("CS_CAM_AT_SPLINE", camATSpline.startFrame, camATSpline.endFrame) + + def getCamEyeSplineRelToPlayerCmd(self, camEyeSplinePlayer: OOTCSMotionCamEyeSplineRelToPlayer): + return self.getCamListCmd( + "CS_CAM_EYE_SPLINE_REL_TO_PLAYER", camEyeSplinePlayer.startFrame, camEyeSplinePlayer.endFrame + ) + + def getCamATSplineRelToPlayerCmd(self, camATSplinePlayer: OOTCSMotionCamATSplineRelToPlayer): + return self.getCamListCmd( + "CS_CAM_AT_SPLINE_REL_TO_PLAYER", camATSplinePlayer.startFrame, camATSplinePlayer.endFrame + ) + + def getCamEyeCmd(self, camEye: OOTCSMotionCamEye): + return self.getCamListCmd("CS_CAM_EYE", camEye.startFrame, camEye.endFrame) + + def getCamATCmd(self, camAT: OOTCSMotionCamAT): + return self.getCamListCmd("CS_CAM_AT", camAT.startFrame, camAT.endFrame) + + def getCamPointCmd(self, camPoint: OOTCSMotionCamPoint): + return indent * 2 + ( + f"CS_CAM_POINT(" + + f"{camPoint.continueFlag}, {camPoint.camRoll}, {camPoint.frame}, {camPoint.viewAngle}f, " + + "".join(f"{pos}, " for pos in camPoint.pos) + + "0),\n" + ) + + +@dataclass +class OOTCSMotionExport(OOTCSMotionExportCommands): + """This class contains functions to create the new cutscene data""" + + csMotionObjects: dict[str, list[Object]] + useDecomp: bool + addBeginEndCmds: bool + entryTotal: int = 0 + frameCount: int = 0 + camEndFrame: int = 0 + + def getOoTRotation(self, obj: Object): + """Returns the converted Blender rotation""" + + def conv(r): + r /= 2.0 * math.pi + r -= math.floor(r) + r = round(r * 0x10000) + + if r >= 0x8000: + r += 0xFFFF0000 + + assert r >= 0 and r <= 0xFFFFFFFF and (r <= 0x7FFF or r >= 0xFFFF8000) + + return hex(r & 0xFFFF) + + rotXYZ = [conv(obj.rotation_euler[0]), conv(obj.rotation_euler[2]), conv(obj.rotation_euler[1])] + return [f"DEG_TO_BINANG({(int(rot, base=16) * (180 / 0x8000)):.3f})" for rot in rotXYZ] + + def getOoTPosition(self, pos): + """Returns the converted Blender position""" + + scale = bpy.context.scene.ootBlenderScale + + x = round(pos[0] * scale) + y = round(pos[2] * scale) + z = round(-pos[1] * scale) + + if any(v < -0x8000 or v >= 0x8000 for v in (x, y, z)): + raise RuntimeError(f"Position(s) too large, out of range: {x}, {y}, {z}") + + return [x, y, z] + + def getActorCueListData(self, isPlayer: bool): + """Returns the Actor Cue List commands from the corresponding objects""" + + playerOrActor = f"{'Player' if isPlayer else 'Actor'}" + actorCueListObjects = self.csMotionObjects[f"CS {playerOrActor} Cue List"] + actorCueListObjects.sort(key=lambda o: o.ootCSMotionProperty.actorCueProp.cueStartFrame) + actorCueData = "" + + self.entryTotal += len(actorCueListObjects) + for obj in actorCueListObjects: + entryTotal = len(obj.children) + + if entryTotal == 0: + raise PluginError("ERROR: The Actor Cue List does not contain any child Actor Cue objects") + + if obj.children[-1].ootEmptyType != "CS Dummy Cue": + # we need an extra point that won't be exported to get the real last cue's + # end frame and end position + raise PluginError("ERROR: The Actor Cue List is missing the extra dummy point!") + + commandType = obj.ootCSMotionProperty.actorCueListProp.commandType + + if commandType == "Custom": + commandType = obj.ootCSMotionProperty.actorCueListProp.commandTypeCustom + elif self.useDecomp: + commandType = ootData.enumData.enumByKey["csCmd"].itemByKey[commandType].id + + actorCueList = OOTCSMotionActorCueList(commandType, entryTotal - 1) # ignoring dummy cue + actorCueData += self.getActorCueListCmd(actorCueList, isPlayer) + + for i, childObj in enumerate(obj.children, 1): + startFrame = childObj.ootCSMotionProperty.actorCueProp.cueStartFrame + if i < len(obj.children) and childObj.ootEmptyType != "CS Dummy Cue": + endFrame = obj.children[i].ootCSMotionProperty.actorCueProp.cueStartFrame + actionID = None + + if isPlayer: + cueID = childObj.ootCSMotionProperty.actorCueProp.playerCueID + if cueID != "Custom": + actionID = ootData.enumData.enumByKey["csPlayerCueId"].itemByKey[cueID].id + + if actionID is None: + actionID = childObj.ootCSMotionProperty.actorCueProp.cueActionID + + actorCue = OOTCSMotionActorCue( + startFrame, + endFrame, + actionID, + self.getOoTRotation(childObj), + self.getOoTPosition(childObj.location), + self.getOoTPosition(obj.children[i].location), + ) + actorCueData += self.getActorCueCmd(actorCue, isPlayer) + + return actorCueData + + def getCameraShotPointData(self, bones, useAT: bool): + """Returns the Camera Point data from the bone data""" + + shotPoints: list[OOTCSMotionCamPoint] = [] + + if len(bones) < 4: + raise RuntimeError("Camera Armature needs at least 4 bones!") + + for bone in bones: + if bone.parent is not None: + raise RuntimeError("Camera Armature bones are not allowed to have parent bones!") + + shotPoints.append( + OOTCSMotionCamPoint( + ("CS_CAM_CONTINUE" if self.useDecomp else "0"), + bone.ootCamShotPointProp.shotPointRoll if useAT else 0, + bone.ootCamShotPointProp.shotPointFrame, + bone.ootCamShotPointProp.shotPointViewAngle, + self.getOoTPosition(bone.head if not useAT else bone.tail), + ) + ) + + # NOTE: because of the game's bug explained in the importer we need to add an extra dummy point when exporting + shotPoints.append(OOTCSMotionCamPoint("CS_CAM_STOP" if self.useDecomp else "-1", 0, 0, 0.0, [0, 0, 0])) + return shotPoints + + def getCamCmdFunc(self, camMode: str, useAT: bool): + """Returns the camera get function depending on the camera mode""" + + camCmdFuncMap = { + "splineEyeOrAT": self.getCamATSplineCmd if useAT else self.getCamEyeSplineCmd, + "splineEyeOrATRelPlayer": self.getCamATSplineRelToPlayerCmd + if useAT + else self.getCamEyeSplineRelToPlayerCmd, + "eyeOrAT": self.getCamATCmd if useAT else self.getCamEyeCmd, + } + + return camCmdFuncMap[camMode] + + def getCamClass(self, camMode: str, useAT: bool): + """Returns the camera dataclass depending on the camera mode""" + + camCmdClassMap = { + "splineEyeOrAT": OOTCSMotionCamATSpline if useAT else OOTCSMotionCamEyeSpline, + "splineEyeOrATRelPlayer": OOTCSMotionCamATSplineRelToPlayer + if useAT + else OOTCSMotionCamEyeSplineRelToPlayer, + "eyeOrAT": OOTCSMotionCamAT if useAT else OOTCSMotionCamEye, + } + + return camCmdClassMap[camMode] + + def getCamListData(self, shotObj: Object, useAT: bool): + """Returns the Camera Shot data from the corresponding Armatures""" + + camPointList = self.getCameraShotPointData(shotObj.data.bones, useAT) + startFrame = shotObj.data.ootCamShotProp.shotStartFrame + + # "fake" end frame + endFrame = ( + startFrame + max(2, sum(point.frame for point in camPointList)) + (camPointList[-2].frame if useAT else 1) + ) + + if not useAT: + for pointData in camPointList: + pointData.frame = 0 + self.camEndFrame = endFrame + + camData = self.getCamClass(shotObj.data.ootCamShotProp.shotCamMode, useAT)(startFrame, endFrame) + return self.getCamCmdFunc(shotObj.data.ootCamShotProp.shotCamMode, useAT)(camData) + "".join( + self.getCamPointCmd(pointData) for pointData in camPointList + ) + + def getCameraShotData(self): + """Returns every Camera Shot commands""" + + shotObjects = self.csMotionObjects["camShot"] + cameraShotData = "" + + if len(shotObjects) > 0: + frameCount = -1 + for shotObj in shotObjects: + cameraShotData += self.getCamListData(shotObj, False) + self.getCamListData(shotObj, True) + frameCount = max(frameCount, self.camEndFrame + 1) + self.frameCount += frameCount + self.entryTotal += len(shotObjects) * 2 + + return cameraShotData + + def getExportData(self): + """Returns the cutscene data""" + + data = self.getActorCueListData(False) + self.getActorCueListData(True) + self.getCameraShotData() + if self.addBeginEndCmds: + data = ( + indent + f"CS_BEGIN_CUTSCENE({self.entryTotal}, {self.frameCount}),\n" + data + indent + "CS_END(),\n" + ) + return data diff --git a/fast64_internal/oot/cutscene/motion/exporter/functions.py b/fast64_internal/oot/cutscene/motion/exporter/functions.py new file mode 100644 index 0000000..8996254 --- /dev/null +++ b/fast64_internal/oot/cutscene/motion/exporter/functions.py @@ -0,0 +1,46 @@ +import bpy + +from bpy.types import Object +from .....utility import PluginError +from .classes import OOTCSMotionExport + + +def getCSMotionObjects(csName: str): + """Returns the object list containing every object from the cutscene to export""" + + csMotionObjects: dict[str, list[Object]] = { + "Cutscene": [], + "CS Actor Cue List": [], + "CS Player Cue List": [], + "camShot": [], + } + + if csName is None: + raise PluginError("ERROR: The cutscene name is None!") + + for obj in bpy.data.objects: + isEmptyObj = obj.type == "EMPTY" + + # look for the cutscene object based on the cutscene name + parentCheck = obj.parent is not None and obj.parent.name == f"Cutscene.{csName}" + csObjCheck = isEmptyObj and obj.ootEmptyType == "Cutscene" and obj.name == f"Cutscene.{csName}" + if parentCheck or csObjCheck: + # add the relevant objects based on the empty type or if it's an armature + if isEmptyObj and obj.ootEmptyType in csMotionObjects.keys(): + csMotionObjects[obj.ootEmptyType].append(obj) + + if obj.type == "ARMATURE" and obj.parent.ootEmptyType == "Cutscene": + csMotionObjects["camShot"].append(obj) + + return csMotionObjects + + +def getCutsceneMotionData(csName: str, addBeginEndCmds: bool): + """Returns the initialised cutscene exporter""" + + # this allows us to change the exporter's variables to get what we need + return OOTCSMotionExport( + getCSMotionObjects(csName), + bpy.context.scene.fast64.oot.hackerFeaturesEnabled or bpy.context.scene.useDecompFeatures, + addBeginEndCmds, + ) diff --git a/fast64_internal/oot/cutscene/motion/importer/__init__.py b/fast64_internal/oot/cutscene/motion/importer/__init__.py new file mode 100644 index 0000000..2bca31f --- /dev/null +++ b/fast64_internal/oot/cutscene/motion/importer/__init__.py @@ -0,0 +1 @@ +from .functions import importCutsceneData diff --git a/fast64_internal/oot/cutscene/motion/importer/classes.py b/fast64_internal/oot/cutscene/motion/importer/classes.py new file mode 100644 index 0000000..4d04af3 --- /dev/null +++ b/fast64_internal/oot/cutscene/motion/importer/classes.py @@ -0,0 +1,559 @@ +import bpy + +from dataclasses import dataclass +from struct import unpack +from bpy.types import Object, Armature +from .....utility import PluginError +from ....oot_constants import ootData +from ..utility import setupCutscene, getBlenderPosition, getRotation + +from ..constants import ( + ootCSMotionLegacyToNewCmdNames, + ootCSMotionListCommands, + ootCSMotionCSCommands, + ootCSMotionListEntryCommands, + ootCSMotionSingleCommands, + ootCSMotionListAndSingleCommands, +) + +from ..io_classes import ( + OOTCSMotionActorCueList, + OOTCSMotionActorCue, + OOTCSMotionCamEyeSpline, + OOTCSMotionCamATSpline, + OOTCSMotionCamEyeSplineRelToPlayer, + OOTCSMotionCamATSplineRelToPlayer, + OOTCSMotionCamEye, + OOTCSMotionCamAT, + OOTCSMotionCamPoint, + OOTCSMotionCutscene, + OOTCSMotionObjectFactory, + OOTCSMotionMisc, + OOTCSMotionMiscList, + OOTCSMotionTransition, +) + + +@dataclass +class ParsedCutscene: + """Local class used to order the parsed cutscene properly""" + + csName: str + csData: list[str] # contains every command lists or standalone ones like ``CS_TRANSITION()`` + + +class OOTCSMotionImportCommands: + """This class contains functions to create the cutscene dataclasses""" + + def getCmdParams(self, data: str, cmdName: str, paramNumber: int): + """Returns the list of every parameter of the given command""" + + params = data.strip().removeprefix(f"{cmdName}(").replace(" ", "").removesuffix(")").split(",") + if len(params) != paramNumber: + raise PluginError( + f"ERROR: The number of expected parameters for `{cmdName}` " + + "and the number of found ones is not the same!" + ) + return params + + def getInteger(self, number: str): + """Returns an int number (handles properly negative hex numbers)""" + + if number.startswith("0x"): + number = number.removeprefix("0x") + + # ``"0" * (8 - len(number)`` adds the missing zeroes (if necessary) to have a 8 digit hex number + return unpack("!i", bytes.fromhex("0" * (8 - len(number)) + number))[0] + else: + return int(number) + + def getNewCutscene(self, csData: str, name: str): + params = self.getCmdParams(csData, "CS_BEGIN_CUTSCENE", OOTCSMotionCutscene.paramNumber) + return OOTCSMotionCutscene(name, self.getInteger(params[0]), self.getInteger(params[1])) + + def getNewActorCueList(self, cmdData: str, isPlayer: bool): + paramNumber = OOTCSMotionActorCueList.paramNumber + paramNumber = paramNumber - 1 if isPlayer else paramNumber + params = self.getCmdParams(cmdData, f"CS_{'PLAYER' if isPlayer else 'ACTOR'}_CUE_LIST", paramNumber) + + if isPlayer: + actorCueList = OOTCSMotionActorCueList("Player", params[0]) + else: + commandType = params[0] + if commandType.startswith("0x"): + # make it a 4 digit hex + commandType = commandType.removeprefix("0x") + commandType = "0x" + "0" * (4 - len(commandType)) + commandType + actorCueList = OOTCSMotionActorCueList(commandType, self.getInteger(params[1].strip())) + + return actorCueList + + def getNewCamEyeSpline(self, cmdData: str): + params = self.getCmdParams(cmdData, "CS_CAM_EYE_SPLINE", OOTCSMotionCamEyeSpline.paramNumber) + return OOTCSMotionCamEyeSpline(self.getInteger(params[0]), self.getInteger(params[1])) + + def getNewCamATSpline(self, cmdData: str): + params = self.getCmdParams(cmdData, "CS_CAM_AT_SPLINE", OOTCSMotionCamATSpline.paramNumber) + return OOTCSMotionCamATSpline(self.getInteger(params[0]), self.getInteger(params[1])) + + def getNewCamEyeSplineRelToPlayer(self, cmdData: str): + params = self.getCmdParams( + cmdData, "CS_CAM_EYE_SPLINE_REL_TO_PLAYER", OOTCSMotionCamEyeSplineRelToPlayer.paramNumber + ) + return OOTCSMotionCamEyeSplineRelToPlayer(self.getInteger(params[0]), self.getInteger(params[1])) + + def getNewCamATSplineRelToPlayer(self, cmdData: str): + params = self.getCmdParams( + cmdData, "CS_CAM_AT_SPLINE_REL_TO_PLAYER", OOTCSMotionCamATSplineRelToPlayer.paramNumber + ) + return OOTCSMotionCamATSplineRelToPlayer(self.getInteger(params[0]), self.getInteger(params[1])) + + def getNewCamEye(self, cmdData: str): + params = self.getCmdParams(cmdData, "CS_CAM_EYE", OOTCSMotionCamEye.paramNumber) + return OOTCSMotionCamEye(self.getInteger(params[0]), self.getInteger(params[1])) + + def getNewCamAT(self, cmdData: str): + params = self.getCmdParams(cmdData, "CS_CAM_AT", OOTCSMotionCamAT.paramNumber) + return OOTCSMotionCamAT(self.getInteger(params[0]), self.getInteger(params[1])) + + def getNewActorCue(self, cmdData: str, isPlayer: bool): + params = self.getCmdParams( + cmdData, f"CS_{'PLAYER' if isPlayer else 'ACTOR'}_CUE", OOTCSMotionActorCue.paramNumber + ) + + return OOTCSMotionActorCue( + self.getInteger(params[1]), + self.getInteger(params[2]), + self.getInteger(params[0]), + [getRotation(params[3]), getRotation(params[4]), getRotation(params[5])], + [self.getInteger(params[6]), self.getInteger(params[7]), self.getInteger(params[8])], + [self.getInteger(params[9]), self.getInteger(params[10]), self.getInteger(params[11])], + ) + + def getNewCamPoint(self, cmdData: str): + params = self.getCmdParams(cmdData, "CS_CAM_POINT", OOTCSMotionCamPoint.paramNumber) + + return OOTCSMotionCamPoint( + params[0], + self.getInteger(params[1]), + self.getInteger(params[2]), + float(params[3][:-1]), + [self.getInteger(params[4]), self.getInteger(params[5]), self.getInteger(params[6])], + ) + + def getNewMisc(self, cmdData: str): + params = self.getCmdParams(cmdData, "CS_MISC", OOTCSMotionMisc.paramNumber) + miscEnum = ootData.enumData.enumByKey["csMiscType"] + item = miscEnum.itemById.get(params[0]) + if item is None: + item = miscEnum.itemByIndex[self.getInteger(params[0])] + miscType = item.id + return OOTCSMotionMisc(self.getInteger(params[1]), self.getInteger(params[2]), miscType) + + def getNewMiscList(self, cmdData: str): + params = self.getCmdParams(cmdData, "CS_MISC_LIST", OOTCSMotionMiscList.paramNumber) + return OOTCSMotionMiscList(params[0]) + + def getNewTransition(self, cmdData: str): + params = self.getCmdParams(cmdData, "CS_TRANSITION", OOTCSMotionTransition.paramNumber) + transitionEnum = ootData.enumData.enumByKey["csTransitionType"] + item = transitionEnum.itemById.get(params[0]) + if item is None: + item = transitionEnum.itemByIndex[self.getInteger(params[0])] + transType = item.id + return OOTCSMotionTransition(self.getInteger(params[1]), self.getInteger(params[2]), transType) + + +@dataclass +class OOTCSMotionImport(OOTCSMotionImportCommands, OOTCSMotionObjectFactory): + """This class contains functions to create the new cutscene Blender data""" + + filePath: str # used when importing from the panel + fileData: str # used when importing the cutscenes when importing a scene + + def getParsedCutscenes(self): + """Returns the parsed commands read from every cutscene we can find""" + + fileData = "" + + if self.fileData is not None: + fileData = self.fileData + elif self.filePath is not None: + with open(self.filePath, "r") as inputFile: + fileData = inputFile.read() + else: + raise PluginError("ERROR: File data can't be found!") + + # replace old names + oldNames = list(ootCSMotionLegacyToNewCmdNames.keys()) + fileData = fileData.replace("CS_CMD_CONTINUE", "CS_CAM_CONTINUE") + fileData = fileData.replace("CS_CMD_STOP", "CS_CAM_STOP") + for oldName in oldNames: + fileData = fileData.replace(f"{oldName}(", f"{ootCSMotionLegacyToNewCmdNames[oldName]}(") + + # parse cutscenes + fileLines = fileData.split("\n") + csData = [] + cutsceneList: list[list[str]] = [] + foundCutscene = False + for line in fileLines: + if not line.startswith("//") and not line.startswith("/*"): + if "CutsceneData " in line: + foundCutscene = True + + if foundCutscene: + sLine = line.strip() + if not sLine.endswith("),") and sLine.endswith(","): + line += fileLines[fileLines.index(line) + 1].strip() + + if len(csData) == 0 or "CS_" in line: + csData.append(line) + + if "};" in line: + foundCutscene = False + cutsceneList.append(csData) + csData = [] + + if len(cutsceneList) == 0: + print("INFO: Found no cutscenes in this file!") + return None + + # parse the commands from every cutscene we found + parsedCutscenes: list[ParsedCutscene] = [] + for cutscene in cutsceneList: + cmdListFound = False + curCmdPrefix = None + parsedCS = [] + parsedData = "" + csName = None + + for line in cutscene: + curCmd = line.strip().split("(")[0] + index = cutscene.index(line) + 1 + nextCmd = cutscene[index].strip().split("(")[0] if index < len(cutscene) else None + line = line.strip() + if "CutsceneData" in line: + csName = line.split(" ")[1][:-2] + + # NOTE: ``CS_UNK_DATA()`` are commands that are completely useless, so we're ignoring those + if csName is not None and not "CS_UNK_DATA" in curCmd: + if curCmd in ootCSMotionCSCommands: + line = line.removesuffix(",") + "\n" + + if curCmd in ootCSMotionSingleCommands and curCmd != "CS_END": + parsedData += line + + if not cmdListFound and curCmd in ootCSMotionListCommands: + cmdListFound = True + parsedData = "" + + # camera and lighting have "non-standard" list names + if curCmd.startswith("CS_CAM"): + curCmdPrefix = "CS_CAM" + elif curCmd.startswith("CS_LIGHT"): + curCmdPrefix = "CS_LIGHT" + else: + curCmdPrefix = curCmd[:-5] + + if curCmdPrefix is not None: + if curCmdPrefix in curCmd: + parsedData += line + elif not cmdListFound and curCmd in ootCSMotionListEntryCommands: + print(f"{csName}, command:\n{line}") + raise PluginError(f"ERROR: Found a list entry outside a list inside ``{csName}``!") + + if cmdListFound and nextCmd == "CS_END" or nextCmd in ootCSMotionListAndSingleCommands: + cmdListFound = False + parsedCS.append(parsedData) + parsedData = "" + elif not "CutsceneData" in curCmd and not "};" in curCmd: + print(f"WARNING: Unknown command found: ``{curCmd}``") + cmdListFound = False + parsedCutscenes.append(ParsedCutscene(csName, parsedCS)) + + return parsedCutscenes + + def getCutsceneList(self): + """Returns the list of cutscenes with the data processed""" + + parsedCutscenes = self.getParsedCutscenes() + + if parsedCutscenes is None: + # if it's none then there's no cutscene in the file + return None + + cutsceneList: list[OOTCSMotionCutscene] = [] + cmdDataList = [ + ("ACTOR_CUE_LIST", self.getNewActorCueList, self.getNewActorCue, "actorCue"), + ("PLAYER_CUE_LIST", self.getNewActorCueList, self.getNewActorCue, "playerCue"), + ("CAM_EYE_SPLINE", self.getNewCamEyeSpline, self.getNewCamPoint, "camEyeSpline"), + ("CAM_AT_SPLINE", self.getNewCamATSpline, self.getNewCamPoint, "camATSpline"), + ( + "CAM_EYE_SPLINE_REL_TO_PLAYER", + self.getNewCamEyeSplineRelToPlayer, + self.getNewCamPoint, + "camEyeSplineRelPlayer", + ), + ( + "CAM_AT_SPLINE_REL_TO_PLAYER", + self.getNewCamATSplineRelToPlayer, + self.getNewCamPoint, + "camATSplineRelPlayer", + ), + ("CAM_EYE", self.getNewCamEye, self.getNewCamPoint, "camEye"), + ("CAM_AT", self.getNewCamAT, self.getNewCamPoint, "camAT"), + ("MISC_LIST", self.getNewMiscList, self.getNewMisc, "misc"), + ("TRANSITION", self.getNewTransition, None, "transition"), + ] + + # for each cutscene from the list returned by getParsedCutscenes(), + # create classes containing the cutscene's informations + # that will be used later when creating Blender objects to complete the import + for parsedCS in parsedCutscenes: + cutscene = None + for data in parsedCS.csData: + # create a new cutscene data + if "CS_BEGIN_CUTSCENE(" in data: + cutscene = self.getNewCutscene(data, parsedCS.csName) + + # if we have a cutscene, create and add the commands data in it + if cutscene is not None: + cmdData = data.removesuffix("\n").split("\n") + cmdListData = cmdData.pop(0) + for cmd, getListFunc, getFunc, listName in cmdDataList: + isPlayer = cmd == "PLAYER_CUE_LIST" + + if f"CS_{cmd}(" in data: + cmdList = getattr(cutscene, f"{listName}List") + + if getListFunc is not None: + if not isPlayer and not cmd == "ACTOR_CUE_LIST": + commandData = getListFunc(cmdListData) + else: + commandData = getListFunc(cmdListData, isPlayer) + + if getFunc is not None: + foundEndCmd = False + for d in cmdData: + if not isPlayer and not cmd == "ACTOR_CUE_LIST": + listEntry = getFunc(d) + if "CAM" in cmd: + flag = d.removeprefix("CS_CAM_POINT(").split(",")[0] + if foundEndCmd: + raise PluginError("ERROR: More camera commands after last one!") + foundEndCmd = "CS_CAM_STOP" in flag or "-1" in flag + else: + listEntry = getFunc(d, isPlayer) + commandData.entries.append(listEntry) + + cmdList.append(commandData) + + # after processing the commands we can add the cutscene to the cutscene list + if cutscene is not None: + cutsceneList.append(cutscene) + return cutsceneList + + def setActorCueData(self, csObj: Object, actorCueList: list[OOTCSMotionActorCueList], cueName: str, csNbr: int): + """Creates the objects from the Actor Cue List data""" + + cueObjList = [] + cueEndFrames = [] + for i, entry in enumerate(actorCueList, 1): + if len(entry.entries) == 0: + raise PluginError("ERROR: Actor Cue List does not have any Actor Cue!") + + lastFrame = lastPos = None + actorCueListObj = self.getNewActorCueListObject( + f"CS_{csNbr:02}.{cueName} Cue List {i:02}", entry.commandType, csObj + ) + + for j, actorCue in enumerate(entry.entries, 1): + if lastFrame is not None and lastFrame != actorCue.startFrame: + raise PluginError("ERROR: Actor Cues are not temporally continuous!") + + if lastPos is not None and lastPos != actorCue.startPos: + raise PluginError("ERROR: Actor Cues are not spatially continuous!") + + cueObjList.append( + self.getNewActorCueObject( + f"CS_{csNbr:02}.{cueName} Cue {i}.{j:02}", + actorCue.startFrame, + actorCue.actionID, + actorCue.startPos, + actorCue.rot, + actorCueListObj, + ) + ) + lastFrame = actorCue.endFrame + lastPos = actorCue.endPos + cueEndFrames.append(lastFrame) + + # we need a dummy actor cue to get the end position of the last real one + if lastFrame is not None: + cueObjList.append( + self.getNewActorCueObject( + f"CS_{csNbr:02}.{cueName} Cue {i}.999 (D)", + lastFrame, + "DUMMY", + lastPos, + actorCue.rot, + actorCueListObj, + ) + ) + cueEndFrames.append(lastFrame + 1) + + # updating the end frames + if len(cueEndFrames) != len(cueObjList): + raise PluginError("ERROR: Lists lengths do not match!") + + for obj, endFrame in zip(cueObjList, cueEndFrames): + # reading this value will trigger the "get" function + getEndFrame = obj.ootCSMotionProperty.actorCueProp.cueEndFrame + + if endFrame != getEndFrame and obj.ootEmptyType != "CS Dummy Cue": + print(f"WARNING: `{obj.name}`'s end frame do not match the one from the script!") + + def validateCameraData(self, cutscene: OOTCSMotionCutscene): + """Safety checks to make sure the camera data is correct""" + + camLists: list[tuple[str, list, list]] = [ + ("Eye and AT Spline", cutscene.camEyeSplineList, cutscene.camATSplineList), + ("Eye and AT Spline Rel to Player", cutscene.camEyeSplineRelPlayerList, cutscene.camATSplineRelPlayerList), + ("Eye and AT", cutscene.camEyeList, cutscene.camATList), + ] + + for camType, eyeList, atList in camLists: + for eyeListEntry, atListEntry in zip(eyeList, atList): + eyeTotal = len(eyeListEntry.entries) + atTotal = len(atListEntry.entries) + + # Eye -> bone's head, AT -> bone's tail, that's why both lists requires the same length + if eyeTotal != atTotal: + raise PluginError(f"ERROR: Found {eyeTotal} Eye lists but {atTotal} AT lists in {camType}!") + + if eyeTotal < 4: + raise PluginError(f"ERROR: Only {eyeTotal} cam point in this command!") + + if eyeTotal > 4: + # NOTE: There is a bug in the game where when incrementing to the next set of key points, + # the key point which checked for whether it's the last point or not is the last point + # of the next set, not the last point of the old set. This means we need to remove + # the extra point at the end that will only tell the game that this camera shot stops. + del eyeListEntry.entries[-1] + del atListEntry.entries[-1] + + def setBoneData( + self, cameraShotObj: Object, boneData: list[tuple[OOTCSMotionCamPoint, OOTCSMotionCamPoint]], csNbr: int + ): + """Creates the bones from the Camera Point data""" + + scale = bpy.context.scene.ootBlenderScale + for i, (eyePoint, atPoint) in enumerate(boneData, 1): + # we need the edit mode to be able to change the bone's location + bpy.ops.object.mode_set(mode="EDIT") + armatureData: Armature = cameraShotObj.data + boneName = f"CS_{csNbr:02}.Camera Point {i:02}" + newEditBone = armatureData.edit_bones.new(boneName) + newEditBone.head = getBlenderPosition(eyePoint.pos, scale) + newEditBone.tail = getBlenderPosition(atPoint.pos, scale) + bpy.ops.object.mode_set(mode="OBJECT") + newBone = armatureData.bones[boneName] + + if eyePoint.frame != 0: + print("WARNING: Frames must be 0!") + + # using the "AT" (look-at) data since this is what determines where the camera is looking + # the "Eye" only sets the location of the camera + newBone.ootCamShotPointProp.shotPointFrame = atPoint.frame + newBone.ootCamShotPointProp.shotPointViewAngle = atPoint.viewAngle + newBone.ootCamShotPointProp.shotPointRoll = atPoint.camRoll + + def setCameraShotData( + self, csObj: Object, eyePoints: list, atPoints: list, camMode: str, startIndex: int, csNbr: int + ): + """Creates the armatures from the Camera Shot data""" + + endIndex = 0 + + # this is required to be able to change the object mode + if bpy.context.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + + for i, (camEyeSpline, camATSpline) in enumerate(zip(eyePoints, atPoints), startIndex): + cameraShotObj = self.getNewArmatureObject(f"CS_{csNbr:02}.Camera Shot {i:02}", True, csObj) + + if camEyeSpline.endFrame < camEyeSpline.startFrame + 2 or camATSpline.endFrame < camATSpline.startFrame + 2: + print("WARNING: Non-standard end frame") + + cameraShotObj.data.ootCamShotProp.shotStartFrame = camEyeSpline.startFrame + cameraShotObj.data.ootCamShotProp.shotCamMode = camMode + boneData = [(eyePoint, atPoint) for eyePoint, atPoint in zip(camEyeSpline.entries, camATSpline.entries)] + self.setBoneData(cameraShotObj, boneData, csNbr) + endIndex = i + + return endIndex + 1 + + def setCutsceneData(self, csNumber): + """Creates the cutscene empty objects from the file data""" + + cutsceneList = self.getCutsceneList() + + if cutsceneList is None: + # if it's none then there's no cutscene in the file + return csNumber + + for i, cutscene in enumerate(cutsceneList, csNumber): + print(f'Found Cutscene "{cutscene.name}"!') + self.validateCameraData(cutscene) + csName = f"Cutscene.{cutscene.name}" + csObj = self.getNewCutsceneObject(csName, cutscene.frameCount, None) + csNumber = i + + print("Importing Actor Cues...") + self.setActorCueData(csObj, cutscene.actorCueList, "Actor", i) + self.setActorCueData(csObj, cutscene.playerCueList, "Player", i) + print("Done!") + + print("Importing Camera Shots...") + if len(cutscene.camEyeSplineList) > 0: + lastIndex = self.setCameraShotData( + csObj, cutscene.camEyeSplineList, cutscene.camATSplineList, "splineEyeOrAT", 1, i + ) + + if len(cutscene.camEyeSplineRelPlayerList) > 0: + lastIndex = self.setCameraShotData( + csObj, + cutscene.camEyeSplineRelPlayerList, + cutscene.camATSplineRelPlayerList, + "splineEyeOrATRelPlayer", + lastIndex, + i, + ) + + if len(cutscene.camEyeList) > 0: + lastIndex = self.setCameraShotData( + csObj, cutscene.camEyeList, cutscene.camATList, "eyeOrAT", lastIndex, i + ) + + if len(cutscene.miscList) > 0: + for miscList in cutscene.miscList: + for miscCmd in miscList.entries: + miscProp = csObj.ootCutsceneProperty.preview.miscList.add() + miscProp.startFrame = miscCmd.startFrame + miscProp.endFrame = miscCmd.endFrame + miscProp.type = miscCmd.type + + if len(cutscene.transitionList) > 0: + for transition in cutscene.transitionList: + transitionProp = csObj.ootCutsceneProperty.preview.transitionList.add() + transitionProp.startFrame = transition.startFrame + transitionProp.endFrame = transition.endFrame + transitionProp.type = transition.type + + # Init camera + preview objects and setup the scene + setupCutscene(csObj) + print("Done!") + bpy.ops.object.select_all(action="DESELECT") + + # ``csNumber`` makes sure there's no duplicates + return csNumber + 1 diff --git a/fast64_internal/oot/cutscene/motion/importer/functions.py b/fast64_internal/oot/cutscene/motion/importer/functions.py new file mode 100644 index 0000000..16a5fbc --- /dev/null +++ b/fast64_internal/oot/cutscene/motion/importer/functions.py @@ -0,0 +1,10 @@ +import bpy + +from .classes import OOTCSMotionImport + + +def importCutsceneData(filePath: str, sceneData: str): + """Initialises and imports the cutscene data from either a file or the scene data""" + # NOTE: ``sceneData`` is the data read when importing a scene + csMotionImport = OOTCSMotionImport(filePath, sceneData) + return csMotionImport.setCutsceneData(bpy.context.scene.ootCSNumber) diff --git a/fast64_internal/oot/cutscene/motion/io_classes.py b/fast64_internal/oot/cutscene/motion/io_classes.py new file mode 100644 index 0000000..462eeb2 --- /dev/null +++ b/fast64_internal/oot/cutscene/motion/io_classes.py @@ -0,0 +1,258 @@ +import bpy + +from dataclasses import dataclass, field +from bpy.types import Object +from ...oot_constants import ootData +from .utility import getBlenderPosition, getBlenderRotation + + +# NOTE: ``paramNumber`` is the expected number of parameters inside the parsed commands, +# this account for the unused parameters. Every classes are based on the commands arguments from ``z64cutscene_commands.h`` + + +@dataclass +class OOTCSMotionBase: + """This class contains common Cutscene data""" + + startFrame: int + endFrame: int + + +@dataclass +class OOTCSMotionCamPoint: + """This class contains a single Camera Point command data""" + + continueFlag: str + camRoll: int + frame: int + viewAngle: float + pos: list[int, int, int] + paramNumber: int = 8 + + +@dataclass +class OOTCSMotionActorCue(OOTCSMotionBase): + """This class contains a single Actor Cue command data""" + + actionID: int + rot: list[str, str, str] + startPos: list[int, int, int] + endPos: list[int, int, int] + paramNumber: int = 15 + + +@dataclass +class OOTCSMotionActorCueList: + """This class contains the Actor Cue List command data""" + + commandType: str + entryTotal: int + entries: list[OOTCSMotionActorCue] = field(default_factory=list) + paramNumber: int = 2 + + +@dataclass +class OOTCSMotionCamEyeSpline(OOTCSMotionBase): + """This class contains the Camera Eye Spline data""" + + entries: list[OOTCSMotionCamPoint] = field(default_factory=list) + paramNumber: int = 2 + + +@dataclass +class OOTCSMotionCamATSpline(OOTCSMotionBase): + """This class contains the Camera AT (look-at) Spline data""" + + entries: list[OOTCSMotionCamPoint] = field(default_factory=list) + paramNumber: int = 2 + + +@dataclass +class OOTCSMotionCamEyeSplineRelToPlayer(OOTCSMotionBase): + """This class contains the Camera Eye Spline Relative to the Player data""" + + entries: list[OOTCSMotionCamPoint] = field(default_factory=list) + paramNumber: int = 2 + + +@dataclass +class OOTCSMotionCamATSplineRelToPlayer(OOTCSMotionBase): + """This class contains the Camera AT Spline Relative to the Player data""" + + entries: list[OOTCSMotionCamPoint] = field(default_factory=list) + paramNumber: int = 2 + + +@dataclass +class OOTCSMotionCamEye(OOTCSMotionBase): + """This class contains a single Camera Eye point""" + + # This feature is not used in the final game and lacks polish, it is recommended to use splines in all cases. + entries: list = field(default_factory=list) + paramNumber: int = 2 + + +@dataclass +class OOTCSMotionCamAT(OOTCSMotionBase): + """This class contains a single Camera AT point""" + + # This feature is not used in the final game and lacks polish, it is recommended to use splines in all cases. + entries: list = field(default_factory=list) + paramNumber: int = 2 + + +@dataclass +class OOTCSMotionMisc(OOTCSMotionBase): + """This class contains a single misc command entry""" + + type: str # see ``CutsceneMiscType`` in decomp + paramNumber: int = 14 + + +@dataclass +class OOTCSMotionMiscList: + """This class contains Misc command data""" + + entryTotal: int + entries: list[OOTCSMotionMisc] = field(default_factory=list) + paramNumber: int = 1 + + +@dataclass +class OOTCSMotionTransition(OOTCSMotionBase): + """This class contains Transition command data""" + + type: str + paramNumber: int = 3 + + +@dataclass +class OOTCSMotionCutscene: + """This class contains a Cutscene's data, including every commands' data""" + + name: str + totalEntries: int + frameCount: int + paramNumber: int = 2 + + actorCueList: list[OOTCSMotionActorCueList] = field(default_factory=list) + playerCueList: list[OOTCSMotionActorCueList] = field(default_factory=list) + camEyeSplineList: list[OOTCSMotionCamEyeSpline] = field(default_factory=list) + camATSplineList: list[OOTCSMotionCamATSpline] = field(default_factory=list) + camEyeSplineRelPlayerList: list[OOTCSMotionCamEyeSplineRelToPlayer] = field(default_factory=list) + camATSplineRelPlayerList: list[OOTCSMotionCamATSplineRelToPlayer] = field(default_factory=list) + camEyeList: list[OOTCSMotionCamEye] = field(default_factory=list) + camATList: list[OOTCSMotionCamAT] = field(default_factory=list) + miscList: list[OOTCSMotionMiscList] = field(default_factory=list) + transitionList: list[OOTCSMotionTransition] = field(default_factory=list) + + +class OOTCSMotionObjectFactory: + """This class contains functions to create new Blender objects""" + + def getNewObject(self, name: str, data, selectObject: bool, parentObj: Object) -> Object: + newObj = bpy.data.objects.new(name=name, object_data=data) + bpy.context.view_layer.active_layer_collection.collection.objects.link(newObj) + if selectObject: + newObj.select_set(True) + bpy.context.view_layer.objects.active = newObj + newObj.parent = parentObj + newObj.location = [0.0, 0.0, 0.0] + newObj.rotation_euler = [0.0, 0.0, 0.0] + newObj.scale = [1.0, 1.0, 1.0] + return newObj + + def getNewEmptyObject(self, name: str, selectObject: bool, parentObj: Object): + return self.getNewObject(name, None, selectObject, parentObj) + + def getNewArmatureObject(self, name: str, selectObject: bool, parentObj: Object): + newArmatureData = bpy.data.armatures.new(name) + newArmatureData.display_type = "STICK" + newArmatureData.show_names = True + newArmatureObject = self.getNewObject(name, newArmatureData, selectObject, parentObj) + return newArmatureObject + + def getNewCutsceneObject(self, name: str, frameCount: int, parentObj: Object): + newCSObj = self.getNewEmptyObject(name, True, parentObj) + newCSObj.ootEmptyType = "Cutscene" + newCSObj.ootCutsceneProperty.csEndFrame = frameCount + return newCSObj + + def getNewActorCueListObject(self, name: str, commandType: str, parentObj: Object): + newActorCueListObj = self.getNewEmptyObject(name, False, parentObj) + newActorCueListObj.ootEmptyType = f"CS {'Player' if 'Player' in name else 'Actor'} Cue List" + cmdEnum = ootData.enumData.enumByKey["csCmd"] + + if commandType == "Player": + commandType = "player_cue" + + index = cmdEnum.itemByKey[commandType].index if commandType in cmdEnum.itemByKey else int(commandType, base=16) + item = cmdEnum.itemByIndex.get(index) + + if item is not None: + newActorCueListObj.ootCSMotionProperty.actorCueListProp.commandType = item.key + else: + newActorCueListObj.ootCSMotionProperty.actorCueListProp.commandType = "Custom" + newActorCueListObj.ootCSMotionProperty.actorCueListProp.commandTypeCustom = commandType + + return newActorCueListObj + + def getNewActorCueObject( + self, + name: str, + startFrame: int, + actionID: int | str, + location: list[int], + rot: list[str], + parentObj: Object, + ): + isDummy = "(D)" in name + isPlayer = not isDummy and not "Actor" in name + + newActorCueObj = self.getNewEmptyObject(name, False, parentObj) + newActorCueObj.location = getBlenderPosition(location, bpy.context.scene.ootBlenderScale) + newActorCueObj.empty_display_type = "ARROWS" + newActorCueObj.rotation_mode = "XZY" + newActorCueObj.rotation_euler = getBlenderRotation(rot) + emptyType = "Dummy" if isDummy else "Player" if isPlayer else "Actor" + newActorCueObj.ootEmptyType = f"CS {emptyType} Cue" + newActorCueObj.ootCSMotionProperty.actorCueProp.cueStartFrame = startFrame + + item = None + if isPlayer: + playerEnum = ootData.enumData.enumByKey["csPlayerCueId"] + if isinstance(actionID, int): + item = playerEnum.itemByIndex.get(actionID) + else: + item = playerEnum.itemByKey.get(actionID) + + if item is not None: + newActorCueObj.ootCSMotionProperty.actorCueProp.playerCueID = item.key + elif not isDummy: + if isPlayer: + newActorCueObj.ootCSMotionProperty.actorCueProp.playerCueID = "Custom" + + if isinstance(actionID, int): + cueActionID = f"0x{actionID:04X}" + else: + cueActionID = actionID + + newActorCueObj.ootCSMotionProperty.actorCueProp.cueActionID = cueActionID + + return newActorCueObj + + def getNewCameraObject( + self, name: str, displaySize: float, clipStart: float, clipEnd: float, alpha: float, parentObj: Object + ): + newCamera = bpy.data.cameras.new(name) + newCameraObj = self.getNewObject(name, newCamera, False, parentObj) + newCameraObj.data.display_size = displaySize + newCameraObj.data.clip_start = clipStart + newCameraObj.data.clip_end = clipEnd + newCameraObj.data.passepartout_alpha = alpha + return newCameraObj + + def getNewActorCuePreviewObject(self, name: str, selectObject, parentObj: Object): + newPreviewObj = self.getNewEmptyObject(name, selectObject, parentObj) + newPreviewObj.ootEmptyType = f"CS {'Actor' if 'Actor' in name else 'Player'} Cue Preview" + return newPreviewObj diff --git a/fast64_internal/oot/cutscene/motion/operators.py b/fast64_internal/oot/cutscene/motion/operators.py new file mode 100644 index 0000000..e028b69 --- /dev/null +++ b/fast64_internal/oot/cutscene/motion/operators.py @@ -0,0 +1,371 @@ +import bpy + +from bpy.types import Object, Operator, Context, Armature +from bpy.utils import register_class, unregister_class +from bpy.props import StringProperty, EnumProperty, BoolProperty +from ....utility import PluginError +from ...oot_constants import ootData +from .io_classes import OOTCSMotionObjectFactory +from .constants import ootEnumCSActorCueListCommandType +from ..preview import initFirstFrame, setupCompositorNodes +from .utility import ( + setupActorCuePreview, + metersToBlend, + getCSMotionValidateObj, + getNameInformations, + createNewBone, + createNewCameraShot, + getCutsceneEndFrame, +) + + +def getActorCueList(operator: Operator, context: Context) -> Object | None: + cueListObj = activeObj = context.view_layer.objects.active + + if activeObj.ootEmptyType == "CS Actor Cue" and activeObj.parent.ootEmptyType == "CS Actor Cue List": + cueListObj = activeObj.parent + + if not cueListObj.ootEmptyType == "CS Actor Cue List" and cueListObj.parent.ootEmptyType == "Cutscene": + operator.report({"WARNING"}, "Select an action list or action point.") + return None + + return cueListObj + + +def createNewActorCueList(csObj: Object, isPlayer: bool): + """Creates a new Actor or Player Cue List and adds one basic cue and the dummy one""" + objFactory = OOTCSMotionObjectFactory() + playerOrActor = "Player" if isPlayer else "Actor" + newActorCueListObj = objFactory.getNewActorCueListObject(f"New {playerOrActor} Cue List", "actor_cue_0_0", None) + index, csPrefix = getNameInformations(csObj, f"{playerOrActor} Cue List", None) + newActorCueListObj.name = f"{csPrefix}.{playerOrActor} Cue List {index:02}" + + # add a basic actor cue and the dummy one + for i in range(2): + nameSuffix = f"{i + 1:02}" if i == 0 else "999 (D)" + newActorCueObj = objFactory.getNewActorCueObject( + f"{csPrefix}.{playerOrActor} Cue {index:02}.{nameSuffix}", + i, + "cueid_none" if isPlayer else "0x0000", + [0, 0, 0], + ["0x0", "0x0", "0x0"], + newActorCueListObj, + ) + + # finally, parenting the object to the cutscene + newActorCueListObj.parent = csObj + + +class OOTCSMotionPlayPreview(Operator): + """Camera Preview Playback""" + + bl_idname = "object.play_preview" + bl_label = "Preview Playback" + + def execute(self, context): + try: + csObj = getCSMotionValidateObj(None, None, None) + + if csObj is not None: + # get and set the camera + cameraObj = None + for childObj in csObj.children: + if childObj.type == "CAMERA": + cameraObj = childObj + break + + # from https://blender.stackexchange.com/a/259103 + space = None + for area in context.screen.areas: + if (area != context.area) and (area.type == "VIEW_3D"): + for space in area.spaces: + if space.type == "VIEW_3D": + break + if space is not None: + space.region_3d.view_perspective = "CAMERA" + + # setup frame data and play the animation + endFrame = getCutsceneEndFrame(csObj) + context.scene.frame_end = endFrame if endFrame > -1 else context.scene.frame_end + context.scene.frame_set(context.scene.frame_start) + bpy.context.scene.ootCSPreviewCSObj = csObj + bpy.context.scene.ootCSPreviewNodesReady = False + setupCompositorNodes() + initFirstFrame(csObj, bpy.context.scene.ootCSPreviewNodesReady, cameraObj) + bpy.ops.screen.animation_cancel() + bpy.ops.screen.animation_play() + return {"FINISHED"} + except: + return {"CANCELLED"} + + +class OOTCSMotionAddBone(Operator): + """Add a bone to an armature""" + + bl_idname = "object.add_bone" + bl_label = "Add Bone" + + def execute(self, context): + try: + cameraShotObj = getCSMotionValidateObj(None, None, "Camera Shot") + + if cameraShotObj is not None: + armatureData: Armature = cameraShotObj.data + cameraShotObj.select_set(True) + lastMode = "EDIT" if "EDIT" in context.mode else context.mode + + # create the new bone with standard informations + blendOne = metersToBlend(context, float(1)) + boneName = f"CS_??.Camera Point ??" + createNewBone(cameraShotObj, boneName, [blendOne, blendOne, 0.0], [blendOne, 0.0, 0.0]) + + # update the name of the new bone and move it to the position of the previous last one + bpy.ops.object.mode_set(mode="EDIT") + if len(armatureData.edit_bones) > 0 and "CS_" in armatureData.edit_bones[-2].name: + secondToLastBone = armatureData.edit_bones[-2] + newBone = armatureData.edit_bones[-1] + splitName = secondToLastBone.name.split(" ") + try: + newBone.name = f"{splitName[0]} Point {int(splitName[2]) + 1:02}" + except ValueError: + newBone.name = f"Camera Point 500" + newBone.head = secondToLastBone.head + newBone.tail = secondToLastBone.tail + bpy.ops.object.mode_set(mode="OBJECT") # going back to object mode to update the bones properly + + if armatureData.bones[-1].name == boneName: + raise PluginError("ERROR: Something went wrong...") + + bpy.ops.object.mode_set(mode=lastMode) + self.report({"INFO"}, "Success!") + return {"FINISHED"} + else: + raise PluginError("You must select an armature object parented to a cutscene empty object!") + except: + return {"CANCELLED"} + + +class OOTCSMotionAddActorCue(Operator): + """Add an entry to a player or actor cue list""" + + bl_idname = "object.add_actor_cue_point" + bl_label = "Add Actor Cue" + + isPlayer: BoolProperty(default=False) + + def execute(self, context): + actorCueListObj = getCSMotionValidateObj(None, None, None) + + try: + if actorCueListObj is not None: + if actorCueListObj.parent is not None and actorCueListObj.parent.ootEmptyType != "Cutscene": + actorCueListObj = actorCueListObj.parent + + # start by creating the new object with basic values + objFactory = OOTCSMotionObjectFactory() + newActorCueObj = objFactory.getNewActorCueObject( + f"New {'Player' if self.isPlayer else 'Actor'} Cue", + 0, + "cueid_none" if self.isPlayer else "0x0000", + [0, 0, 0], + ["0x0", "0x0", "0x0"], + None, + ) + + # if there's other actor cues, take the information from the last non-dummy one + if len(actorCueListObj.children) > 0: + dummyCue = None + for i, obj in enumerate(actorCueListObj.children): + if obj.ootEmptyType == "CS Dummy Cue": + dummyCue = obj + + if dummyCue is not None: + lastCueObj = actorCueListObj.children[i - 1] + nameSplit = lastCueObj.name.split(".") + try: + index = int(nameSplit[-1]) + 1 + except ValueError: + index = i + 500 # huge number to make sure it's going at the end of the list + startFrame = dummyCue.ootCSMotionProperty.actorCueProp.cueStartFrame + newActorCueObj.name = f"{nameSplit[0]}.{nameSplit[1]}.{index:02}" + newActorCueObj.ootCSMotionProperty.actorCueProp.cueStartFrame = startFrame + dummyCue.ootCSMotionProperty.actorCueProp.cueStartFrame += 1 + newActorCueObj.location = lastCueObj.location + newActorCueObj.rotation_euler = lastCueObj.rotation_euler + else: + # else create the name from the actor cue list object + nameSplit = actorCueListObj.name.split(".") + try: + index = int(nameSplit[1].split(" ")[3]) + except ValueError: + index = 500 + newActorCueObj.name = f"{nameSplit[0]}.{nameSplit[1][:-8]} {index}.01" + + # add the dummy cue since the list is empty + nameSplit = newActorCueObj.name.split(".") + newDummyCueObj = objFactory.getNewActorCueObject( + f"{nameSplit[0]}.{nameSplit[1]}.999 (D)", + 1, + "0x0000", + [0, 0, 0], + ["0x0", "0x0", "0x0"], + actorCueListObj, + ) + + # update the end frame of the real cue + getEndFrame = newActorCueObj.ootCSMotionProperty.actorCueProp.cueEndFrame + newActorCueObj.parent = actorCueListObj + else: + raise PluginError("ERROR: Select the Actor or Player Cue List!") + + self.report({"INFO"}, "Success!") + return {"FINISHED"} + except Exception as e: + # print(e) + raise PluginError("ERROR: Something went wrong.") + return {"CANCELLED"} + + +class OOTCSMotionCreateActorCuePreview(Operator): + """Create a preview empty object for a player or an actor cue list""" + + bl_idname = "object.create_actor_cue_preview" + bl_label = "Create Preview Object" + + def execute(self, context): + cueList = getCSMotionValidateObj(None, None, None) + + if cueList is not None and cueList.ootEmptyType in ["CS Actor Cue List", "CS Player Cue List"]: + isCueMoving = setupActorCuePreview( + cueList.parent, "Actor" if "Actor" in cueList.ootEmptyType else "Player", True, cueList + ) + self.report({"INFO"}, "Success!" if isCueMoving else "Actor Cue don't move, ignored preview.") + return {"FINISHED"} + else: + return {"CANCELLED"} + + +class OOTCSMotionCreateCameraShot(Operator): + """Create and initialize a camera shot armature""" + + bl_idname = "object.create_camera_shot" + bl_label = "Create Camera Shot" + + def execute(self, context): + csObj = getCSMotionValidateObj(None, None, None) + + if csObj is not None: + createNewCameraShot(csObj) + self.report({"INFO"}, "Success!") + return {"FINISHED"} + else: + return {"CANCELLED"} + + +class OOTCSMotionCreatePlayerCueList(Operator): + """Create a cutscene player cue list""" + + bl_idname = "object.create_player_cue_list" + bl_label = "Create Player Cue List" + + def execute(self, context): + csObj = getCSMotionValidateObj(None, None, None) + + try: + if csObj is not None: + createNewActorCueList(csObj, True) + else: + raise PluginError("ERROR: You must select the cutscene object!") + + self.report({"INFO"}, "Success!") + return {"FINISHED"} + except: + return {"CANCELLED"} + + +class OOTCSMotionCreateActorCueList(Operator): + """Create a cutscene actor cue list""" + + bl_idname = "object.create_actor_cue_list" + bl_label = "Create Actor Cue list" + + def execute(self, context): + csObj = getCSMotionValidateObj(None, None, None) + + try: + if csObj is not None: + createNewActorCueList(csObj, False) + else: + raise PluginError("ERROR: You must select the cutscene object!") + + self.report({"INFO"}, "Success!") + return {"FINISHED"} + except: + return {"CANCELLED"} + + +class OOT_SearchActorCueCmdTypeEnumOperator(Operator): + bl_idname = "object.oot_search_actorcue_cmdtype_enum_operator" + bl_label = "Select Command Type" + bl_property = "commandType" + bl_options = {"REGISTER", "UNDO"} + + commandType: EnumProperty(items=ootEnumCSActorCueListCommandType, default="actor_cue_0_0") + objName: StringProperty() + + def execute(self, context): + obj = bpy.data.objects[self.objName] + obj.ootCSMotionProperty.actorCueListProp.commandType = self.commandType + + context.region.tag_redraw() + self.report({"INFO"}, "Selected: " + self.commandType) + return {"FINISHED"} + + def invoke(self, context, event): + context.window_manager.invoke_search_popup(self) + return {"RUNNING_MODAL"} + + +class OOT_SearchPlayerCueIdEnumOperator(Operator): + bl_idname = "object.oot_search_playercueid_enum_operator" + bl_label = "Select Player Cue ID" + bl_property = "playerCueID" + bl_options = {"REGISTER", "UNDO"} + + playerCueID: EnumProperty(items=ootData.enumData.ootEnumCsPlayerCueId, default="cueid_none") + objName: StringProperty() + + def execute(self, context): + obj = bpy.data.objects[self.objName] + obj.ootCSMotionProperty.actorCueProp.playerCueID = self.playerCueID + + context.region.tag_redraw() + self.report({"INFO"}, "Selected: " + self.playerCueID) + return {"FINISHED"} + + def invoke(self, context, event): + context.window_manager.invoke_search_popup(self) + return {"RUNNING_MODAL"} + + +classes = ( + OOTCSMotionPlayPreview, + OOTCSMotionAddBone, + OOTCSMotionAddActorCue, + OOTCSMotionCreateActorCuePreview, + OOTCSMotionCreateCameraShot, + OOTCSMotionCreatePlayerCueList, + OOTCSMotionCreateActorCueList, + OOT_SearchActorCueCmdTypeEnumOperator, + OOT_SearchPlayerCueIdEnumOperator, +) + + +def csMotion_ops_register(): + for cls in classes: + register_class(cls) + + +def csMotion_ops_unregister(): + for cls in reversed(classes): + unregister_class(cls) diff --git a/fast64_internal/oot/cutscene/motion/panels.py b/fast64_internal/oot/cutscene/motion/panels.py new file mode 100644 index 0000000..8b5a975 --- /dev/null +++ b/fast64_internal/oot/cutscene/motion/panels.py @@ -0,0 +1,50 @@ +from bpy.types import Panel +from bpy.utils import register_class, unregister_class +from .properties import OOTCSMotionCameraShotProperty, OOTCSMotionCameraShotPointProperty + + +class OOT_CSMotionCameraShotPanel(Panel): + bl_label = "Cutscene Motion Camera Shot Controls" + bl_idname = "OOT_PT_camera_shot_panel" + bl_space_type = "PROPERTIES" + bl_region_type = "WINDOW" + bl_context = "object" + bl_options = {"HIDE_HEADER"} + + def draw(self, context): + obj = context.view_layer.objects.active + layout = self.layout + + if obj.type == "ARMATURE": + camShotProp: OOTCSMotionCameraShotProperty = obj.data.ootCamShotProp + camShotPointProp: OOTCSMotionCameraShotPointProperty = None + activeBone = editBone = None + + box = layout.box() + camShotProp.draw_props(box, self.bl_label) + + if obj.mode == "POSE": + box.label(text="Warning: You can't be in 'Pose' mode to edit camera bones!") + elif obj.mode == "OBJECT": + activeBone = obj.data.bones.active + if activeBone is not None: + camShotPointProp = activeBone.ootCamShotPointProp + camShotPointProp.draw_props(box) + elif obj.mode == "EDIT": + editBone = obj.data.edit_bones.active + if editBone is not None: + camShotPointProp = editBone.ootCamShotPointProp + camShotPointProp.draw_props(box) + + +classes = (OOT_CSMotionCameraShotPanel,) + + +def csMotion_panels_register(): + for cls in classes: + register_class(cls) + + +def csMotion_panels_unregister(): + for cls in reversed(classes): + unregister_class(cls) diff --git a/fast64_internal/oot/cutscene/motion/preview.py b/fast64_internal/oot/cutscene/motion/preview.py new file mode 100644 index 0000000..9c9007d --- /dev/null +++ b/fast64_internal/oot/cutscene/motion/preview.py @@ -0,0 +1,220 @@ +import bpy +import math + +from mathutils import Vector, Quaternion +from bpy.app.handlers import persistent +from bpy.types import Object, Scene +from ....utility import PluginError +from .utility import ( + BoneData, + getCameraShotBoneData, + getCSMotionValidateObj, +) + + +# Eye -> Position, AT -> look-at, where the camera is looking + + +def getUndefinedCamPosEye(): + return (Vector((0.0, 0.0, 0.0)), Quaternion(), 45.0) + + +def getUndefinedCamPosAT(): + return (Vector((0.0, 0.0, 0.0)), Vector((0.0, 0.0, -1.0)), 0.0, 45.0) + + +def getSplineCoeffs(t: float): + # Reverse engineered from func_800BB0A0 in Debug ROM + + t = min(t, 1.0) # no check for t < 0 + oneminust = 1.0 - t + tsq = t * t + oneminustcube6 = (oneminust * oneminust * oneminust) / 6.0 + tcube = tsq * t + spline2 = ((tcube * 0.5) - tsq) + 0.6666667 + spline3 = ((tsq + t - tcube) * 0.5) + 0.16666667 + tcube6 = tcube / 6.0 + + return oneminustcube6, spline2, spline3, tcube6 + + +def getZ64SplineInterpolate(bones: list[BoneData], frame: int): + # Reverse engineered from func_800BB2B4 in Debug ROM + + p = 0 # keyframe + t = 0.0 # ratioBetweenPoints + + # Simulate cutscene for all frames up to present + for _ in range(frame): + if p + 2 >= len(bones) - 1: + # Camera position is uninitialized + return getUndefinedCamPosAT() + + framesPoint1 = bones[p + 1].frame + denomPoint1 = 1.0 / framesPoint1 if framesPoint1 != 0 else 0.0 + framesPoint2 = bones[p + 2].frame + denomPoint2 = 1.0 / framesPoint2 if framesPoint2 != 0 else 0.0 + dt = max(t * (denomPoint2 - denomPoint1) + denomPoint1, 0.0) + + # Different from in game; we remove the extra dummy point at import + # and add it at export. + if t + dt >= 1.0: + if p + 3 == len(bones) - 1: + break + + t -= 1.0 + p += 1 + + t += dt + + # Spline interpolate for current situation + if p + 3 > len(bones) - 1: + if frame > 0: + print("Internal error in spline algorithm") + + return getUndefinedCamPosAT() + + s1, s2, s3, s4 = getSplineCoeffs(t) + eye = s1 * bones[p].head + s2 * bones[p + 1].head + s3 * bones[p + 2].head + s4 * bones[p + 3].head + at = s1 * bones[p].tail + s2 * bones[p + 1].tail + s3 * bones[p + 2].tail + s4 * bones[p + 3].tail + roll = s1 * bones[p].roll + s2 * bones[p + 1].roll + s3 * bones[p + 2].roll + s4 * bones[p + 3].roll + viewAngle = ( + s1 * bones[p].viewAngle + + s2 * bones[p + 1].viewAngle + + s3 * bones[p + 2].viewAngle + + s4 * bones[p + 3].viewAngle + ) + + return (eye, at, roll, viewAngle) + + +def getCmdCamState(shotObj: Object, frame: int): + frame -= shotObj.data.ootCamShotProp.shotStartFrame + 1 + + if frame < 0: + print(f"Warning, camera command evaluated for frame {frame}") + return getUndefinedCamPosEye() + + bones = getCameraShotBoneData(shotObj, False) + + if bones is None: + return getUndefinedCamPosEye() + + eye, at, roll, viewAngle = getZ64SplineInterpolate(bones, frame) + # TODO handle cam_mode (relativeToLink) + lookvec = at - eye + + if lookvec.length < 1e-6: + return getUndefinedCamPosEye() + + lookvec.normalize() + ux = Vector((1.0, 0.0, 0.0)) + uy = Vector((0.0, 1.0, 0.0)) + uz = Vector((0.0, 0.0, 1.0)) + qroll = Quaternion(uz, roll * math.pi / 128.0) + qpitch = Quaternion(-ux, math.pi + math.acos(lookvec.dot(uz))) + qyaw = Quaternion(-uz, math.atan2(lookvec.dot(ux), lookvec.dot(uy))) + + return (eye, qyaw @ qpitch @ qroll, viewAngle) + + +def getCutsceneCamState(csObj: Object, frame: int): + """Returns (pos, rot_quat, viewAngle)""" + + shotObjects: list[Object] = [] + for childObj in csObj.children: + obj = getCSMotionValidateObj(csObj, childObj, "Camera Shot") + if obj is not None: + shotObjects.append(obj) + shotObjects.sort(key=lambda obj: obj.name) + shotObj = None + + if len(shotObjects) > 0: + startFrame = -1 + + for obj in shotObjects: + if obj.data.ootCamShotProp.shotStartFrame < frame and obj.data.ootCamShotProp.shotStartFrame > startFrame: + shotObj = obj + startFrame = obj.data.ootCamShotProp.shotStartFrame + + if shotObj is None or len(shotObjects) == 0: + return getUndefinedCamPosEye() + + return getCmdCamState(shotObj, frame) + + +def getActorCueState(cueListObj: Object, frame: int): + pos = Vector((0.0, 0.0, 0.0)) + rot = Vector((0.0, 0.0, 0.0)) + + cueList: list[Object] = [] + for cueObj in cueListObj.children: + obj = getCSMotionValidateObj(None, cueObj, None) + if obj is not None: + cueList.append(obj) + cueList.sort(key=lambda o: o.ootCSMotionProperty.actorCueProp.cueStartFrame) + + if len(cueList) >= 2: + for i in range(len(cueList) - 1): + startFrame = cueList[i].ootCSMotionProperty.actorCueProp.cueStartFrame + endFrame = cueList[i + 1].ootCSMotionProperty.actorCueProp.cueStartFrame + + if endFrame > startFrame and frame > startFrame: + if frame <= endFrame: + pos = cueList[i].location * (endFrame - frame) + cueList[i + 1].location * (frame - startFrame) + pos /= endFrame - startFrame + rot = cueList[i].rotation_euler + return pos, rot + elif i == len(cueList) - 2: + # If went off the end, use last position + pos = cueList[i + 1].location + rot = cueList[i].rotation_euler + return pos, rot + + +@persistent +def previewFrameHandler(scene: Scene): + for obj in bpy.data.objects: + parentObj = obj.parent + if ( + parentObj is not None + and parentObj.type == "EMPTY" + and parentObj.name.startswith("Cutscene.") + and parentObj.ootEmptyType == "Cutscene" + ): + if obj.type == "CAMERA": + pos, rot_quat, viewAngle = getCutsceneCamState(parentObj, scene.frame_current) + + if parentObj.ootCutsceneProperty.preview.useWidescreen: + viewAngle *= 4 / 3 + + if pos is not None: + obj.location = pos + obj.rotation_mode = "QUATERNION" + obj.rotation_quaternion = rot_quat + obj.data.angle = math.pi * viewAngle / 180.0 + elif obj.ootEmptyType in ["CS Actor Cue Preview", "CS Player Cue Preview"]: + cueListToPreview = None + if "Actor" in obj.ootEmptyType: + cueListToPreview = obj.ootCSMotionProperty.actorCueListProp.actorCueListToPreview + elif "Player" in obj.ootEmptyType: + cueListToPreview = obj.ootCSMotionProperty.actorCueListProp.playerCueListToPreview + else: + raise PluginError("Unknown Empty Type!") + + if cueListToPreview is not None: + pos, rot = getActorCueState(cueListToPreview, scene.frame_current) + + if pos is not None: + obj.location = pos + obj.rotation_mode = "XYZ" + obj.rotation_euler = rot + + +def csMotion_preview_register(): + bpy.app.handlers.frame_change_pre.append(previewFrameHandler) + + +def csMotion_preview_unregister(): + if previewFrameHandler in bpy.app.handlers.frame_change_pre: + bpy.app.handlers.frame_change_pre.remove(previewFrameHandler) diff --git a/fast64_internal/oot/cutscene/motion/properties.py b/fast64_internal/oot/cutscene/motion/properties.py new file mode 100644 index 0000000..0138cda --- /dev/null +++ b/fast64_internal/oot/cutscene/motion/properties.py @@ -0,0 +1,277 @@ +import bpy + +from bpy.types import PropertyGroup, Object, UILayout, Armature, Bone, Scene, EditBone +from bpy.props import IntProperty, StringProperty, PointerProperty, EnumProperty, FloatProperty +from bpy.utils import register_class, unregister_class +from ...oot_upgrade import upgradeCutsceneMotion +from ...oot_utility import getEnumName +from ...oot_constants import ootData +from .constants import ootEnumCSMotionCamMode, ootEnumCSActorCueListCommandType + +from .operators import ( + OOTCSMotionAddActorCue, + OOTCSMotionCreateActorCuePreview, + OOT_SearchActorCueCmdTypeEnumOperator, + OOTCSMotionAddBone, + OOT_SearchPlayerCueIdEnumOperator, +) + + +def getNextCuesStartFrame(self): + curCueObj = bpy.context.view_layer.objects.active + parentObj = curCueObj.parent + + if parentObj is not None and parentObj.ootEmptyType in ["CS Actor Cue List", "CS Player Cue List"]: + if curCueObj.ootEmptyType in ["CS Actor Cue", "CS Player Cue"]: + actorCueObjList = parentObj.children + for i, obj in enumerate(actorCueObjList): + if obj == curCueObj: + return actorCueObjList[i + 1].ootCSMotionProperty.actorCueProp.cueStartFrame + return -1 + + +class OOTCSMotionActorCueListProperty(PropertyGroup): + commandType: EnumProperty( + items=ootEnumCSActorCueListCommandType, name="CS Actor Cue Command Type", default="actor_cue_0_0" + ) + commandTypeCustom: StringProperty(name="CS Actor Cue Command Type Custom") + actorCueListToPreview: PointerProperty( + type=Object, name="", poll=lambda self, object: self.isActorCueListObj(object, "CS Actor Cue List") + ) + playerCueListToPreview: PointerProperty( + type=Object, name="", poll=lambda self, object: self.isActorCueListObj(object, "CS Player Cue List") + ) + + def isActorCueListObj(self, obj: Object, emptyType: str): + return obj.type == "EMPTY" and obj.ootEmptyType == emptyType + + def draw_props(self, layout: UILayout, isPreview: bool, labelPrefix: str, objName: str): + box = layout.box() + box.box().label(text=f"{labelPrefix} Cue List") + isPlayer = labelPrefix == "Player" + + # Player Cue has only one command type + if not isPlayer and not isPreview: + searchBox = box.row() + searchOp = searchBox.operator( + OOT_SearchActorCueCmdTypeEnumOperator.bl_idname, icon="VIEWZOOM", text="Command Type:" + ) + searchOp.objName = objName + searchBox.label(text=getEnumName(ootEnumCSActorCueListCommandType, self.commandType)) + + if self.commandType == "Custom": + split = box.split(factor=0.5) + split.label(text="Command Type Custom:") + split.prop(self, "commandTypeCustom", text="") + + if not isPreview: + split = box.split(factor=0.5) + addCueOp = split.operator(OOTCSMotionAddActorCue.bl_idname, text=f"Add {labelPrefix} Cue") + addCueOp.isPlayer = isPlayer + split.operator(OOTCSMotionCreateActorCuePreview.bl_idname) + else: + split = box.split(factor=0.5) + split.label(text=f"{labelPrefix} Cue List to Preview") + split.prop(self, f"{labelPrefix.lower()}CueListToPreview") + + +class OOTCSMotionActorCueProperty(PropertyGroup): + cueStartFrame: IntProperty(name="Start Frame", description="Start frame of the Actor Cue", default=0, min=0) + + cueEndFrame: IntProperty( + name="End Frame", + description="End Frame of the Actor Cue, corresponds to the Start Frame of the next Actor Cue", + default=0, + min=-1, + get=lambda self: getNextCuesStartFrame(self), + ) + + playerCueID: EnumProperty(items=ootData.enumData.ootEnumCsPlayerCueId, default="cueid_none") + cueActionID: StringProperty( + name="Action ID", default="0x0001", description="Actor action. Meaning is unique for each different actor." + ) + + def draw_props(self, layout: UILayout, labelPrefix: str, isDummy: bool, objName: str): + box = layout.box() + dummyExtra = "(Sets previous Actor Cue's end frame/pos.)" if isDummy else "" + boxBox = box.box() + boxBox.label(text=f"{labelPrefix if not isDummy else 'Dummy'} Cue") + if len(dummyExtra) > 0: + boxBox.label(text=dummyExtra) + + if not isDummy and self.cueStartFrame > self.cueEndFrame: + box.label( + text="Warning: Start Frame > End Frame!", + icon="ERROR", + ) + + split = box.split(factor=0.5) + split.prop(self, "cueStartFrame") + if not isDummy: + label = f"{labelPrefix} Cue (Action) ID:" + isPlayer = labelPrefix == "Player" + split.prop(self, "cueEndFrame") + + if isPlayer: + split = box.split(factor=0.5) + searchOp = split.operator(OOT_SearchPlayerCueIdEnumOperator.bl_idname, icon="VIEWZOOM", text=label) + searchOp.objName = objName + split.label(text=getEnumName(ootData.enumData.ootEnumCsPlayerCueId, self.playerCueID)) + + if not isPlayer or self.playerCueID == "Custom": + split = box.split(factor=0.5) + split.label(text=label) + split.prop(self, "cueActionID", text="") + + addCueOp = box.operator(OOTCSMotionAddActorCue.bl_idname, text=f"Add {labelPrefix} Cue") + addCueOp.isPlayer = isPlayer + + +class OOTCSMotionCameraShotProperty(PropertyGroup): + shotStartFrame: IntProperty(name="Start Frame", description="Shot start frame", default=0, min=0) + + # only used as a hint for users + shotEndFrame: IntProperty( + name="End Frame", + description="Shot end frame", + default=0, + min=-1, + get=lambda self: self.getEndFrame(), + ) + + shotCamMode: EnumProperty( + items=ootEnumCSMotionCamMode, + name="Mode", + description="Camera command mode", + default="splineEyeOrAT", + ) + + def getEndFrame(self, camShotObj: Object = None): + if camShotObj is None: + camShotObj = bpy.context.view_layer.objects.active + + if camShotObj.type == "ARMATURE": + boneFrameList: list[int] = [bone.ootCamShotPointProp.shotPointFrame for bone in camShotObj.data.bones] + # "fake" eye end frame + return self.shotStartFrame + max(2, sum(frame for frame in boneFrameList)) + 1 + return -1 + + def draw_props(self, layout: UILayout, label: str): + box = layout.box() + box.label(text=label) + split = box.split(factor=0.5) + split.prop(self, "shotStartFrame") + split.prop(self, "shotEndFrame") + box.row().prop(self, "shotCamMode", expand=True) + box.operator(OOTCSMotionAddBone.bl_idname) + + +class OOTCSMotionCameraShotPointProperty(PropertyGroup): + shotPointFrame: IntProperty( + name="Frame", + description="Key point frames value", + default=30, + min=0, + get=lambda self: self.getValue("frame"), + set=lambda self, value: self.setValue(value, "frame"), + ) + + shotPointViewAngle: FloatProperty( + name="FoV", + description="Field of view (degrees)", + default=60.0, + min=0.01, + max=179.99, + get=lambda self: self.getValue("viewAngle"), + set=lambda self, value: self.setValue(value, "viewAngle"), + ) + + shotPointRoll: IntProperty( + name="Roll", + description="Camera roll (degrees), positive turns image clockwise", + default=0, + min=-128, + max=127, + get=lambda self: self.getValue("roll"), + set=lambda self, value: self.setValue(value, "roll"), + ) + + # internal usage only + frame: IntProperty(default=30, min=0) + viewAngle: FloatProperty(default=60.0, min=0.01, max=179.99) + roll: IntProperty(min=-128, max=127, default=0) + + def getBoneFromEditBone(self, shotObject: Object, editBone: EditBone) -> Bone | None: + for bone in shotObject.data.bones: + if bone.name == editBone.name: + return bone + else: + print("Could not find corresponding bone") + return None + + def getValue(self, propName: str): + return getattr(self, propName) + + def setValue(self, value, propName: str): + setattr(self, propName, value) + + activeObj = bpy.context.view_layer.objects.active + if activeObj.mode == "EDIT": + bone = self.getBoneFromEditBone(activeObj, activeObj.data.edit_bones.active) + if bone is not None: + setattr(bone.ootCamShotPointProp, propName, value) + activeObj.data.bones.active = bone + + def draw_props(self, layout: UILayout): + box = layout.box() + box.label(text="Bone / Key point:") + row = box.row() + for propName in ["shotPointFrame", "shotPointViewAngle", "shotPointRoll"]: + row.prop(self, propName) + + +class OOTCutsceneMotionProperty(PropertyGroup): + actorCueListProp: PointerProperty(type=OOTCSMotionActorCueListProperty) + actorCueProp: PointerProperty(type=OOTCSMotionActorCueProperty) + + @staticmethod + def upgrade_object(csObj: Object): + print(f"Processing '{csObj.name}'...") + upgradeCutsceneMotion(csObj) + print("Done!") + + +classes = ( + OOTCSMotionActorCueListProperty, + OOTCSMotionActorCueProperty, + OOTCSMotionCameraShotProperty, + OOTCSMotionCameraShotPointProperty, + OOTCutsceneMotionProperty, +) + + +def csMotion_props_register(): + for cls in classes: + register_class(cls) + + Object.ootCSMotionProperty = PointerProperty(type=OOTCutsceneMotionProperty) + Armature.ootCamShotProp = PointerProperty(type=OOTCSMotionCameraShotProperty) + Bone.ootCamShotPointProp = PointerProperty(type=OOTCSMotionCameraShotPointProperty) + EditBone.ootCamShotPointProp = PointerProperty(type=OOTCSMotionCameraShotPointProperty) + Scene.previewPlayerAge = EnumProperty( + items=[("link_adult", "Adult", "Adult Link (170 cm)", 0), ("link_child", "Child", "Child Link (130 cm)", 1)], + name="Player Age for Preview", + description="For setting Link's height for preview", + default="link_adult", + ) + + +def csMotion_props_unregister(): + del Scene.previewPlayerAge + del EditBone.ootCamShotPointProp + del Bone.ootCamShotPointProp + del Armature.ootCamShotProp + del Object.ootCSMotionProperty + + for cls in classes: + unregister_class(cls) diff --git a/fast64_internal/oot/cutscene/motion/utility.py b/fast64_internal/oot/cutscene/motion/utility.py new file mode 100644 index 0000000..a7c4c89 --- /dev/null +++ b/fast64_internal/oot/cutscene/motion/utility.py @@ -0,0 +1,275 @@ +import bpy + +from bpy.types import Object, Bone, Context, EditBone, Armature +from mathutils import Vector +from ....utility import yUpToZUp +from ...oot_utility import ootParseRotation + + +class BoneData: + def __init__(self, shotObj: Object, bone: Bone): + editBone = self.getEditBoneFromBone(shotObj, bone) if shotObj.mode == "EDIT" else None + self.name = bone.name + self.head = editBone.head if editBone is not None else bone.head + self.tail = editBone.tail if editBone is not None else bone.tail + + self.frame = ( + editBone["shotPointFrame"] + if editBone is not None and "shotPointFrame" in editBone + else bone.ootCamShotPointProp.shotPointFrame + ) + + self.viewAngle = ( + editBone["shotPointViewAngle"] + if editBone is not None and "shotPointViewAngle" in editBone + else bone.ootCamShotPointProp.shotPointViewAngle + ) + + self.roll = ( + editBone["shotPointRoll"] + if editBone is not None and "shotPointRoll" in editBone + else bone.ootCamShotPointProp.shotPointRoll + ) + + def getEditBoneFromBone(self, shotObj: Object, bone: Bone) -> EditBone | Bone: + for editBone in shotObj.data.edit_bones: + if editBone.name == bone.name: + return editBone + else: + print("Could not find corresponding bone") + return bone + + +def createNewBone(cameraShotObj: Object, name: str, headPos: list[float], tailPos: list[float]): + if bpy.context.mode != "OBJECT": + bpy.ops.object.mode_set(mode="OBJECT") + bpy.ops.object.mode_set(mode="EDIT") + armatureData: Armature = cameraShotObj.data + newEditBone = armatureData.edit_bones.new(name) + newEditBone.head = headPos + newEditBone.tail = tailPos + bpy.ops.object.mode_set(mode="OBJECT") + newBone = armatureData.bones[name] + newBone.ootCamShotPointProp.shotPointFrame = 30 + newBone.ootCamShotPointProp.shotPointViewAngle = 60.0 + newBone.ootCamShotPointProp.shotPointRoll = 0 + + +def createNewCameraShot(csObj: Object): + from .io_classes import OOTCSMotionObjectFactory # circular import fix + + index, csPrefix = getNameInformations(csObj, "Camera Shot", None) + + # create a basic armature + name = f"{csPrefix}.Camera Shot {index:02}" + newCameraShotObj = OOTCSMotionObjectFactory().getNewArmatureObject(name, True, csObj) + + # add 4 bones since it's the minimum required + for i in range(1, 5): + posX = metersToBlend(bpy.context, float(i)) + createNewBone( + newCameraShotObj, + f"{csPrefix}.Camera Point {i:02}", + [posX, 0.0, 0.0], + [posX, metersToBlend(bpy.context, 1.0), 0.0], + ) + + +def getBlenderPosition(pos: list[int], scale: int): + """Returns the converted OoT position""" + + # OoT: +X right, +Y up, -Z forward + # Blender: +X right, +Z up, +Y forward + return [float(pos[0]) / scale, -float(pos[2]) / scale, float(pos[1]) / scale] + + +def getRotation(data: str): + """Returns the rotation converted to hexadecimal""" + + if "DEG_TO_BINANG" in data or not "0x" in data: + angle = float(data.split("(")[1].removesuffix(")") if "DEG_TO_BINANG" in data else data) + binang = int(angle * (0x8000 / 180.0)) # from ``DEG_TO_BINANG()`` in decomp + + # if the angle value is higher than 0xFFFF it means we're at 360 degrees + return f"0x{0xFFFF if binang > 0xFFFF else binang:04X}" + else: + return data + + +def getBlenderRotation(rotation: list[str]): + """Returns the converted OoT rotation""" + + rot = [int(getRotation(r), base=16) for r in rotation] + return yUpToZUp @ Vector(ootParseRotation(rot)) + + +def getCSMotionValidateObj(csObj: Object, obj: Object, target: str): + """Checks if the given object belong to CS Motion and return it if true""" + + if csObj is not None and obj.parent != csObj: + return None + + if obj is None: + obj = bpy.context.view_layer.objects.active + + if target is None or target != "Camera Shot": + nonListTypes = ["CS Player Cue", "CS Actor Cue", "CS Dummy Cue", "Cutscene"] + listTypes = ["CS Player Cue List", "CS Actor Cue List"] + + if obj.type == "EMPTY" and obj.ootEmptyType in nonListTypes or obj.ootEmptyType in listTypes: + return obj + elif target is not None and target == "Camera Shot": + # get the camera shot + parentObj = obj.parent + if obj.type == "ARMATURE" and parentObj is not None and parentObj.type == "EMPTY": + return obj + + return None + + +def getNameInformations(csObj: Object, target: str, index: int): + idx = csPrefix = None + csNbr = 0 + + # get the last target objects names + if csObj.children is not None: + for i, obj in enumerate(csObj.children): + if obj.type == "EMPTY" and "Cue List" in obj.name or "Camera Shot" in obj.name or target in obj.name: + csPrefix = obj.name.split(".")[0] + if target in obj.name: + try: + idx = int(obj.name.split(" ")[-1]) + 1 + except ValueError: + pass # idx will stay None + + # saving the cutscene number if the target objects can't be found + if csPrefix is None: + for obj in bpy.data.objects: + if obj.type == "EMPTY" and obj.ootEmptyType == "Cutscene": + csNbr += 1 + + if obj.name == csObj.name: + break + + csPrefix = f"CS_{csNbr:02}" + + if idx is None: + idx = 1 + + if index is not None: + idx = index + + return idx, csPrefix + + +def metersToBlend(context: Context, value: float): + return value * 56.0 / context.scene.ootBlenderScale + + +def setupActorCuePreview(csObj: Object, actorOrPlayer: str, selectObject: bool, cueList: Object): + from .io_classes import OOTCSMotionObjectFactory # circular import fix + + # check if the cue actually moves, if not it's not necessary to create a preview object + isCueMoving = False + for i in range(len(cueList.children) - 1): + actorCue = cueList.children[i] + nextCue = cueList.children[i + 1] + curPos = [round(pos) for pos in actorCue.location] + nextPos = [round(pos) for pos in nextCue.location] + if curPos != nextPos: + isCueMoving = True + break + + if isCueMoving: + try: + index, csPrefix = getNameInformations(csObj, "Preview", int(cueList.name.split(" ")[-1])) + name = f"{csPrefix}.{actorOrPlayer} Cue Preview {index:02}" + except ValueError: + name = f"{cueList.name} - Preview" + + for obj in csObj.children: + if obj.name == name: + previewObj = obj + break + else: + previewObj = OOTCSMotionObjectFactory().getNewActorCuePreviewObject(name, selectObject, csObj) + + actorHeight = 1.5 + if actorOrPlayer == "Player": + actorHeight = 1.7 if bpy.context.scene.previewPlayerAge == "link_adult" else 1.3 + + previewObj.empty_display_type = "SINGLE_ARROW" + previewObj.empty_display_size = metersToBlend(bpy.context, actorHeight) + setattr(previewObj.ootCSMotionProperty.actorCueListProp, f"{actorOrPlayer.lower()}CueListToPreview", cueList) + + return isCueMoving + + +def getCameraShotBoneData(shotObj: Object, runChecks: bool): + boneDataList: list[BoneData] = [] + for bone in shotObj.data.bones: + if bone.parent is not None: + print("Camera armature bones are not allowed to have parent bones") + return None + boneDataList.append(BoneData(shotObj, bone)) + boneDataList.sort(key=lambda b: b.name) + + if runChecks: + if boneDataList is None: + raise RuntimeError("Error in bone properties") + + if len(boneDataList) < 4: + raise RuntimeError(f"Only {len(boneDataList)} bones in `{shotObj.name}`") + + return boneDataList + + +def getCutsceneEndFrame(csObj: Object): + shotObjects: list[Object] = [] + for childObj in csObj.children: + obj = getCSMotionValidateObj(csObj, childObj, "Camera Shot") + if obj is not None: + shotObjects.append(obj) + shotObjects.sort(key=lambda obj: obj.name) + + csEndFrame = -1 + for shotObj in shotObjects: + # Seems to be the algorithm which was used in the canon tool: the at list + # counts the extra point (same frames as the last real point), and the pos + # list doesn't count the extra point but adds 1. Of course, neither of these + # values is actually the number of frames the camera motion lasts for. + boneDataList = getCameraShotBoneData(shotObj, True) + endFrame = shotObj.data.ootCamShotProp.shotStartFrame + max(2, sum(b.frame for b in boneDataList)) + 2 + csEndFrame = max(csEndFrame, endFrame) + return csEndFrame + + +def setupCutscene(csObj: Object): + from .io_classes import OOTCSMotionObjectFactory # circular import fix + + objFactory = OOTCSMotionObjectFactory() + context = bpy.context + bpy.context.scene.ootCSPreviewCSObj = csObj + camObj = objFactory.getNewCameraObject( + f"{csObj.name}.Camera", + metersToBlend(context, 0.25), + metersToBlend(context, 1e-3), + metersToBlend(context, 200.0), + 0.95, + csObj, + ) + print("Created New Camera!") + + # Preview setup, used when importing cutscenes + for obj in csObj.children: + if obj.ootEmptyType in ["CS Actor Cue List", "CS Player Cue List"]: + setupActorCuePreview(csObj, "Actor" if "Actor" in obj.ootEmptyType else "Player", False, obj) + + # Other setup + context.scene.frame_start = 0 + context.scene.frame_end = max(getCutsceneEndFrame(csObj), context.scene.frame_end) + context.scene.render.fps = 20 + context.scene.render.resolution_x = 320 + context.scene.render.resolution_y = 240 + context.scene.frame_set(context.scene.frame_start) + context.scene.camera = camObj diff --git a/fast64_internal/oot/cutscene/operators.py b/fast64_internal/oot/cutscene/operators.py index 530bd32..3dc8a02 100644 --- a/fast64_internal/oot/cutscene/operators.py +++ b/fast64_internal/oot/cutscene/operators.py @@ -1,4 +1,6 @@ import os +import re + from bpy.path import abspath from bpy.ops import object from bpy.props import StringProperty, EnumProperty, IntProperty @@ -9,6 +11,8 @@ from ..oot_utility import getCollection from ..scene.exporter.to_c import ootCutsceneDataToC from .exporter import convertCutsceneObject from .constants import ootEnumCSTextboxType, ootEnumCSListType, ootEnumCSListTypeIcons +from .motion.importer import importCutsceneData +from .motion.exporter import getCutsceneMotionData def checkGetFilePaths(context: Context): @@ -56,7 +60,69 @@ def drawCSListAddOp(layout: UILayout, objName: str, collectionType): row = box.row(align=True) for _ in range(3): addButton(row) - box.label(text="Install zcamedit for camera/actor motion.") + + +def insertCutsceneData(filePath: str, csName: str): + """Inserts the motion data in the cutscene and returns the new data""" + fileLines = [] + includes = ootCutsceneIncludes("").source.split("\n") + + # if the file is not found then it's likely a new file that needs to be created + try: + with open(filePath, "r") as inputFile: + fileLines = inputFile.readlines() + fileLines = fileLines[len(includes) - 1 :] + except FileNotFoundError: + fileLines = [] + + foundCutscene = False + motionExporter = getCutsceneMotionData(csName, False) + beginIndex = 0 + + for i, line in enumerate(fileLines): + # skip commented lines + if not line.startswith("//") and not line.startswith("/*"): + if f"CutsceneData {csName}" in line: + foundCutscene = True + + if foundCutscene: + if "CS_BEGIN_CUTSCENE" in line: + # save the index of the line that contains the entry total and the framecount for later use + beginIndex = i + + # looking at next line to see if we reached the end of the cs script + index = i + 1 + if index < len(fileLines) and "CS_END" in fileLines[index]: + # exporting first to get the new framecount and the total of entries values + fileLines.insert(index, motionExporter.getExportData()) + + # update framecount and entry total values + beginLine = fileLines[beginIndex] + reMatch = re.search(r"\b\(([0-9a-fA-F, ]*)\b", beginLine) + if reMatch is not None: + params = reMatch[1].split(", ") + entryTotal = int(params[0], base=0) + frameCount = int(params[1], base=0) + entries = re.sub( + r"\b\(([0-9a-fA-F]*)\b", f"({entryTotal + motionExporter.entryTotal}", beginLine + ) + frames = re.sub(r"\b([0-9a-fA-F]*)\)", f"{frameCount + motionExporter.frameCount})", beginLine) + fileLines[beginIndex] = f"{entries.split(', ')[0]}, {frames.split(', ')[1]}" + else: + raise PluginError("ERROR: Can't find `CS_BEGIN_CUTSCENE()` parameters!") + break + + fileData = CData() + + if not foundCutscene: + print(f"WARNING: Can't find Cutscene ``{csName}``, inserting data at the end of the file.") + motionExporter.addBeginEndCmds = True + csArrayName = f"CutsceneData {csName}[]" + fileLines.append("\n" + csArrayName + " = {\n" + motionExporter.getExportData() + "};\n") + fileData.header = f"{csArrayName};\n" + + fileData.source = "".join(line for line in fileLines) + return fileData class OOTCSTextboxAdd(Operator): @@ -92,6 +158,26 @@ class OOTCSListAdd(Operator): return {"FINISHED"} +class OOT_ImportCutscene(Operator): + bl_idname = "object.oot_import_cutscenes" + bl_label = "Import All Cutscenes" + bl_options = {"REGISTER", "UNDO", "PRESET"} + + def execute(self, context): + try: + if context.mode != "OBJECT": + object.mode_set(mode="OBJECT") + + path = abspath(context.scene.ootCutsceneImportPath) + context.scene.ootCSNumber = importCutsceneData(path, None) + + self.report({"INFO"}, "Successfully imported cutscenes") + return {"FINISHED"} + except Exception as e: + raisePluginError(self, e) + return {"CANCELLED"} + + class OOT_ExportCutscene(Operator): bl_idname = "object.oot_export_cutscene" bl_label = "Export Cutscene" @@ -113,7 +199,11 @@ class OOT_ExportCutscene(Operator): cpath, hpath, headerfilename = checkGetFilePaths(context) csdata = ootCutsceneIncludes(headerfilename) converted = convertCutsceneObject(activeObj) - csdata.append(ootCutsceneDataToC(converted, converted.name)) + + if context.scene.exportMotionOnly: + csdata.append(insertCutsceneData(cpath, activeObj.name.removeprefix("Cutscene."))) + else: + csdata.append(ootCutsceneDataToC(converted, converted.name)) writeCData(csdata, hpath, cpath) self.report({"INFO"}, "Successfully exported cutscene") @@ -132,19 +222,27 @@ class OOT_ExportAllCutscenes(Operator): try: if context.mode != "OBJECT": object.mode_set(mode="OBJECT") + cpath, hpath, headerfilename = checkGetFilePaths(context) csdata = ootCutsceneIncludes(headerfilename) count = 0 + for obj in context.view_layer.objects: - if obj.data is not None or obj.ootEmptyType != "Cutscene": - continue - if obj.parent is not None: - raise PluginError("Cutscene object must not be parented to anything") - converted = convertCutsceneObject(obj) - csdata.append(ootCutsceneDataToC(converted, converted.name)) - count += 1 + if obj.type == "EMPTY" and obj.ootEmptyType == "Cutscene": + if obj.parent is not None: + print(f"Parent: {obj.parent.name}, Object: {obj.name}") + raise PluginError("Cutscene object must not be parented to anything") + + converted = convertCutsceneObject(obj) + if context.scene.exportMotionOnly: + raise PluginError("ERROR: Not implemented yet.") + else: + csdata.append(ootCutsceneDataToC(converted, converted.name)) + count += 1 + if count == 0: raise PluginError("Could not find any cutscenes to export") + writeCData(csdata, hpath, cpath) self.report({"INFO"}, "Successfully exported " + str(count) + " cutscenes") return {"FINISHED"} @@ -156,6 +254,7 @@ class OOT_ExportAllCutscenes(Operator): oot_cutscene_classes = ( OOTCSTextboxAdd, OOTCSListAdd, + OOT_ImportCutscene, OOT_ExportCutscene, OOT_ExportAllCutscenes, ) @@ -166,10 +265,14 @@ def cutscene_ops_register(): register_class(cls) Scene.ootCutsceneExportPath = StringProperty(name="File", subtype="FILE_PATH") + Scene.ootCutsceneImportPath = StringProperty(name="File", subtype="FILE_PATH") + Scene.ootCSNumber = IntProperty(default=1, min=0) def cutscene_ops_unregister(): for cls in reversed(oot_cutscene_classes): unregister_class(cls) + del Scene.ootCSNumber + del Scene.ootCutsceneImportPath del Scene.ootCutsceneExportPath diff --git a/fast64_internal/oot/cutscene/panels.py b/fast64_internal/oot/cutscene/panels.py index f7a8323..4a0dddb 100644 --- a/fast64_internal/oot/cutscene/panels.py +++ b/fast64_internal/oot/cutscene/panels.py @@ -1,7 +1,9 @@ from bpy.utils import register_class, unregister_class +from bpy.types import Scene +from bpy.props import BoolProperty from ...utility import prop_split from ...panels import OOT_Panel -from .operators import OOT_ExportCutscene, OOT_ExportAllCutscenes +from .operators import OOT_ExportCutscene, OOT_ExportAllCutscenes, OOT_ImportCutscene class OOT_CutscenePanel(OOT_Panel): @@ -12,20 +14,65 @@ class OOT_CutscenePanel(OOT_Panel): bl_category = "OOT" def draw(self, context): - col = self.layout.column() - col.operator(OOT_ExportCutscene.bl_idname) + layout = self.layout + + exportBox = layout.box() + exportBox.label(text="Cutscene Exporter") + + col = exportBox.column() + if not context.scene.fast64.oot.hackerFeaturesEnabled: + col.prop(context.scene, "useDecompFeatures") + col.prop(context.scene, "exportMotionOnly") + + prop_split(exportBox, context.scene, "ootCutsceneExportPath", "Export To") + + activeObj = context.view_layer.objects.active + label = None + col = exportBox.column() + colcol = col.column() + if activeObj is None or activeObj.type != "EMPTY" or activeObj.ootEmptyType != "Cutscene": + label = "Select a cutscene object" + + if activeObj is not None and activeObj.parent is not None: + label = "Cutscene object must not be parented to anything" + + if label is not None: + col.label(text=label) + colcol.enabled = False + + colcol.operator(OOT_ExportCutscene.bl_idname) col.operator(OOT_ExportAllCutscenes.bl_idname) - prop_split(col, context.scene, "ootCutsceneExportPath", "File") + + importBox = layout.box() + importBox.label(text="Cutscene Importer") + prop_split(importBox, context.scene, "ootCutsceneImportPath", "Import From") + + col = importBox.column() + col.operator(OOT_ImportCutscene.bl_idname) oot_cutscene_panel_classes = (OOT_CutscenePanel,) def cutscene_panels_register(): + Scene.useDecompFeatures = BoolProperty( + name="Use Decomp for Export", description="Use names and macros from decomp when exporting", default=True + ) + Scene.exportMotionOnly = BoolProperty( + name="Export Motion Data Only", + description=( + "Export everything or only the camera and actor motion data.\n" + + "This will insert the data into the cutscene." + ), + ) + for cls in oot_cutscene_panel_classes: register_class(cls) def cutscene_panels_unregister(): + del Scene.exportMotionOnly + del Scene.useDecompFeatures + for cls in oot_cutscene_panel_classes: unregister_class(cls) diff --git a/fast64_internal/oot/cutscene/preview.py b/fast64_internal/oot/cutscene/preview.py new file mode 100644 index 0000000..7693099 --- /dev/null +++ b/fast64_internal/oot/cutscene/preview.py @@ -0,0 +1,278 @@ +import bpy + +from math import isclose +from bpy.types import Scene, Object, Node +from bpy.app.handlers import persistent +from ...utility import gammaInverse, hexOrDecInt + + +def getLerp(max: float, min: float, val: float): + # from ``Environment_LerpWeight()`` in decomp + diff = max - min + ret = None + + if diff != 0.0: + ret = 1.0 - (max - val) / diff + + if not ret >= 1.0: + return ret + + return 1.0 + + +def getColor(value: float) -> float: + """Returns the value converted in the linear color space""" + return gammaInverse([value / 0xFF, 0.0, 0.0])[0] + + +def getNode(node: Node, type: str, name: str, location: tuple[float, float]): + """Returns a compositor node""" + if node is None: + node = bpy.context.scene.node_tree.nodes.new(type) + node.select = False + node.name = node.label = name + node.location = location + return node + + +def setupCompositorNodes(): + """Creates or re-setups compositor nodes""" + if bpy.app.version < (3, 6, 0): + # Blender 3.6+ is required in order to use Compositor Nodes + return + + if not bpy.context.scene.use_nodes: + bpy.context.scene.use_nodes = True + + # sets the compositor render mode to "Camera" + space = None + for area in bpy.context.screen.areas: + if (area != bpy.context.area) and (area.type == "VIEW_3D"): + for space in area.spaces: + if space.type == "VIEW_3D": + break + if space is not None and space.shading.use_compositor != "CAMERA": + space.shading.use_compositor = "CAMERA" + + # if everything's fine and nodes are already ready to use stop there + if bpy.context.scene.ootCSPreviewNodesReady: + return + + # get the existing nodes + nodeTree = bpy.context.scene.node_tree + nodeRenderLayer = nodeComposite = nodeRGBTrans = nodeAlphaOver = nodeRGBMisc = nodeMixRGBMisc = None + for node in nodeTree.nodes.values(): + if node.type == "R_LAYERS": + nodeRenderLayer = node + if node.type == "COMPOSITE": + nodeComposite = node + if node.label == "CSTrans_RGB": + nodeRGBTrans = node + if node.label == "CSMisc_RGB": + nodeRGBMisc = node + if node.label == "CSPreview_AlphaOver": + nodeAlphaOver = node + if node.label == "CSMisc_MixRGB": + nodeMixRGBMisc = node + + # create or set the data of each nodes + nodeRenderLayer = getNode(nodeRenderLayer, "CompositorNodeRLayers", "CSPreview_RenderLayer", (-500, 0)) + nodeRGBMisc = getNode(nodeRGBMisc, "CompositorNodeRGB", "CSMisc_RGB", (-200, -200)) + nodeRGBTrans = getNode(nodeRGBTrans, "CompositorNodeRGB", "CSTrans_RGB", (0, -200)) + nodeMixRGBMisc = getNode(nodeMixRGBMisc, "CompositorNodeMixRGB", "CSMisc_MixRGB", (0, 0)) + nodeAlphaOver = getNode(nodeAlphaOver, "CompositorNodeAlphaOver", "CSPreview_AlphaOver", (200, 0)) + nodeComposite = getNode(nodeComposite, "CompositorNodeComposite", "CSPreview_Composite", (400, 0)) + + # link the nodes together + nodeTree.links.new(nodeMixRGBMisc.inputs[1], nodeRenderLayer.outputs[0]) + nodeTree.links.new(nodeMixRGBMisc.inputs[2], nodeRGBMisc.outputs[0]) + nodeTree.links.new(nodeAlphaOver.inputs[1], nodeMixRGBMisc.outputs[0]) + nodeTree.links.new(nodeAlphaOver.inputs[2], nodeRGBTrans.outputs[0]) + nodeTree.links.new(nodeComposite.inputs[0], nodeAlphaOver.outputs[0]) + + # misc settings + nodeMixRGBMisc.use_alpha = True + nodeMixRGBMisc.blend_type = "COLOR" + bpy.context.scene.ootCSPreviewNodesReady = True + + +def initFirstFrame(csObj: Object, useNodeFeatures: bool, defaultCam: Object): + # set default values for frame 0 + if useNodeFeatures: + color = [0.0, 0.0, 0.0, 0.0] + bpy.context.scene.node_tree.nodes["CSTrans_RGB"].outputs[0].default_value = color + bpy.context.scene.node_tree.nodes["CSMisc_RGB"].outputs[0].default_value = color + csObj.ootCutsceneProperty.preview.trigger = False + csObj.ootCutsceneProperty.preview.isFixedCamSet = False + if defaultCam is not None: + bpy.context.scene.camera = defaultCam + + +def processCurrentFrame(csObj: Object, curFrame: float, useNodeFeatures: bool, cameraObjects: Object): + """Execute the actions of each command to create the preview for the current frame""" + # this function was partially adapted from ``z_demo.c`` + + if curFrame == 0: + initFirstFrame(csObj, useNodeFeatures, cameraObjects[1]) + + if useNodeFeatures: + previewProp = csObj.ootCutsceneProperty.preview + for transitionCmd in csObj.ootCutsceneProperty.preview.transitionList: + startFrame = transitionCmd.startFrame + endFrame = transitionCmd.endFrame + frameCur = curFrame + isTriggerInstance = transitionCmd.type == "CS_TRANS_TRIGGER_INSTANCE" + linear160 = getColor(160.0) + + if transitionCmd.type == "Unknown": + print("ERROR: Unknown command!") + + if curFrame == 0: + # makes transitions appear a frame earlier if frame 0 + frameCur += 1 + + if isTriggerInstance and not previewProp.trigger: + color = [linear160, linear160, linear160, 1.0] + bpy.context.scene.node_tree.nodes["CSTrans_RGB"].outputs[0].default_value = color + + if frameCur >= startFrame and frameCur <= endFrame: + color = [0.0, 0.0, 0.0, 0.0] + lerp = getLerp(endFrame, startFrame, frameCur) + linear255 = getColor(255.0) + linear155 = getColor(155.0) + + if isTriggerInstance: + previewProp.trigger = True + + if transitionCmd.type.endswith("IN"): + alpha = linear255 * lerp + else: + alpha = (1.0 - lerp) * linear255 + + if "HALF" in transitionCmd.type: + if "_IN_" in transitionCmd.type: + alpha = linear255 - ((1.0 - lerp) * linear155) + else: + alpha = linear255 - (linear155 * lerp) + + if "_GRAY_" in transitionCmd.type or previewProp.trigger: + color[0] = color[1] = color[2] = linear160 * alpha + elif "_RED_" in transitionCmd.type: + color[0] = linear255 * alpha + elif "_GREEN_" in transitionCmd.type: + color[1] = linear255 * alpha + elif "_BLUE_" in transitionCmd.type: + color[2] = linear255 * alpha + + color[3] = alpha + bpy.context.scene.node_tree.nodes["CSTrans_RGB"].outputs[0].default_value = color + + for miscCmd in csObj.ootCutsceneProperty.preview.miscList: + startFrame = miscCmd.startFrame + endFrame = miscCmd.endFrame + + if miscCmd.type == "Unknown": + print("ERROR: Unknown command!") + + if curFrame == startFrame: + if miscCmd.type == "CS_MISC_SET_LOCKED_VIEWPOINT" and not None in cameraObjects: + bpy.context.scene.camera = cameraObjects[int(csObj.ootCutsceneProperty.preview.isFixedCamSet)] + csObj.ootCutsceneProperty.preview.isFixedCamSet ^= True + + if miscCmd.type == "CS_MISC_STOP_CUTSCENE": + # stop the playback and set the frame to 0 + bpy.ops.screen.animation_cancel() + bpy.context.scene.frame_set(bpy.context.scene.frame_start) + + if curFrame >= startFrame and (curFrame < endFrame or endFrame == startFrame): + if useNodeFeatures: + color = [0.0, 0.0, 0.0, 0.0] + lerp = getLerp(endFrame - 1, startFrame, curFrame) + + if miscCmd.type in ["CS_MISC_VISMONO_SEPIA", "CS_MISC_VISMONO_BLACK_AND_WHITE"]: + if miscCmd.type == "CS_MISC_VISMONO_SEPIA": + col = [255.0, 180.0, 100.0] + else: + col = [255.0, 255.0, 254.0] + + for i in range(3): + color[i] = getColor(col[i]) + + color[3] = getColor(255.0) * lerp + bpy.context.scene.node_tree.nodes["CSMisc_RGB"].outputs[0].default_value = color + + if miscCmd.type == "CS_MISC_RED_PULSATING_LIGHTS": + color = bpy.context.scene.node_tree.nodes["CSMisc_RGB"].outputs[0].default_value + color[0] = getColor(255.0) + color[1] = color[2] = 0.0 + step = 0.05 + if curFrame & 8: + if color[3] < 0.20: + color[3] += step + else: + if color[3] > 0.05: + color[3] -= step + bpy.context.scene.node_tree.nodes["CSMisc_RGB"].outputs[0].default_value = color + + +@persistent +def cutscenePreviewFrameHandler(scene: Scene): + """Preview frame handler, executes each frame when the cutscene is played""" + csObj: Object = bpy.context.scene.ootCSPreviewCSObj + + if csObj is None or not csObj.type == "EMPTY" and not csObj.ootEmptyType == "Cutscene": + return + + # populate ``cameraObjects`` with the cutscene camera and the first found prerend fixed camera + cameraObjects = [None, None] + for obj in csObj.children: + if obj.type == "CAMERA": + cameraObjects[1] = obj + break + + foundObj = None + for obj in bpy.data.objects: + if obj.type == "CAMERA" and obj.parent is not None and obj.parent.ootEmptyType in ["Scene", "Room"]: + camPosProp = obj.ootCameraPositionProperty + camTypes = ["CAM_SET_PREREND0", "CAM_SET_PREREND_FIXED"] + if camPosProp.camSType != "Custom" and camPosProp.camSType in camTypes: + foundObj = obj + break + elif camPosProp.camSType == "Custom": + if camPosProp.camSTypeCustom.startswith("0x"): + if hexOrDecInt(camPosProp.camSTypeCustom) == 25: + foundObj = obj + break + elif camPosProp.camSTypeCustom in camTypes: + foundObj = obj + break + + if foundObj is not None: + cameraObjects[0] = foundObj + + # setup nodes + bpy.context.scene.ootCSPreviewNodesReady = False + setupCompositorNodes() + + # execute the main preview logic + previewProp = csObj.ootCutsceneProperty.preview + curFrame = bpy.context.scene.frame_current + if isclose(curFrame, previewProp.prevFrame, abs_tol=1) and isclose(curFrame, previewProp.nextFrame, abs_tol=1): + processCurrentFrame(csObj, curFrame, bpy.context.scene.ootCSPreviewNodesReady, cameraObjects) + else: + # Simulate cutscene for all frames up to present + for i in range(bpy.context.scene.frame_current): + processCurrentFrame(csObj, i, bpy.context.scene.ootCSPreviewNodesReady, cameraObjects) + + # since we reached the end of the function, the current frame becomes the previous one + previewProp.nextFrame = curFrame + 2 if curFrame > previewProp.prevFrame else curFrame - 2 + previewProp.prevFrame = curFrame + + +def cutscene_preview_register(): + bpy.app.handlers.frame_change_pre.append(cutscenePreviewFrameHandler) + + +def cutscene_preview_unregister(): + if cutscenePreviewFrameHandler in bpy.app.handlers.frame_change_pre: + bpy.app.handlers.frame_change_pre.remove(cutscenePreviewFrameHandler) diff --git a/fast64_internal/oot/cutscene/properties.py b/fast64_internal/oot/cutscene/properties.py index ae6d25a..f6f5625 100644 --- a/fast64_internal/oot/cutscene/properties.py +++ b/fast64_internal/oot/cutscene/properties.py @@ -1,10 +1,19 @@ -from bpy.types import PropertyGroup, Object, UILayout +import bpy +from bpy.types import PropertyGroup, Object, UILayout, Scene, Context from bpy.props import StringProperty, EnumProperty, IntProperty, BoolProperty, CollectionProperty, PointerProperty from bpy.utils import register_class, unregister_class from ...utility import PluginError, prop_split from ..oot_utility import OOTCollectionAdd, drawCollectionOps from .operators import OOTCSTextboxAdd, drawCSListAddOp from .constants import ootEnumCSTextboxType, ootEnumCSListType, ootEnumCSTransitionType, ootEnumCSTextboxTypeIcons +from .motion.preview import previewFrameHandler + +from .motion.operators import ( + OOTCSMotionPlayPreview, + OOTCSMotionCreateCameraShot, + OOTCSMotionCreatePlayerCueList, + OOTCSMotionCreateActorCueList, +) # Perhaps this should have been called something like OOTCSParentPropertyType, @@ -219,6 +228,43 @@ class OOTCSListProperty(PropertyGroup): addOp.objName = objName +class OOTCutsceneCommandBase: + startFrame: IntProperty(min=0) + endFrame: IntProperty(min=0) + + +class OOTCutsceneTransitionProperty(OOTCutsceneCommandBase, PropertyGroup): + type: StringProperty(default="Unknown") + + +class OOTCutsceneMiscProperty(OOTCutsceneCommandBase, PropertyGroup): + type: StringProperty(default="Unknown") + + +class OOTCutscenePreviewProperty(PropertyGroup): + useWidescreen: BoolProperty( + name="Use Widescreen Camera", default=False, update=lambda self, context: self.updateWidescreen(context) + ) + + transitionList: CollectionProperty(type=OOTCutsceneTransitionProperty) + miscList: CollectionProperty(type=OOTCutsceneMiscProperty) + + trigger: BoolProperty(default=False) # for ``CS_TRANS_TRIGGER_INSTANCE`` + isFixedCamSet: BoolProperty(default=False) + prevFrame: IntProperty(default=-1) + nextFrame: IntProperty(default=1) + + def updateWidescreen(self, context: Context): + if self.useWidescreen: + context.scene.render.resolution_x = 426 + else: + context.scene.render.resolution_x = 320 + context.scene.render.resolution_y = 240 + + # force a refresh of the current frame + previewFrameHandler(context.scene) + + class OOTCutsceneProperty(PropertyGroup): csEndFrame: IntProperty(name="End Frame", min=0, default=100) csWriteTerminator: BoolProperty(name="Write Terminator (Code Execution)") @@ -227,7 +273,23 @@ class OOTCutsceneProperty(PropertyGroup): csTermEnd: IntProperty(name="End Frm", min=0, default=100) csLists: CollectionProperty(type=OOTCSListProperty, name="Cutscene Lists") + preview: PointerProperty(type=OOTCutscenePreviewProperty) + def draw_props(self, layout: UILayout, obj: Object): + split = layout.split(factor=0.5) + split.label(text="Player Age for Preview") + split.prop(bpy.context.scene, "previewPlayerAge", text="") + + split = layout.split(factor=0.5) + split.operator(OOTCSMotionCreateCameraShot.bl_idname, icon="VIEW_CAMERA") + split.operator(OOTCSMotionPlayPreview.bl_idname, icon="RESTRICT_VIEW_OFF") + + split = layout.split(factor=0.5) + split.operator(OOTCSMotionCreatePlayerCueList.bl_idname) + split.operator(OOTCSMotionCreateActorCueList.bl_idname) + + layout.prop(self.preview, "useWidescreen") + layout.prop(self, "csEndFrame") layout.prop(self, "csWriteTerminator") if self.csWriteTerminator: @@ -250,6 +312,9 @@ classes = ( OOTCS0x09Property, OOTCSUnkProperty, OOTCSListProperty, + OOTCutsceneTransitionProperty, + OOTCutsceneMiscProperty, + OOTCutscenePreviewProperty, OOTCutsceneProperty, ) @@ -259,9 +324,13 @@ def cutscene_props_register(): register_class(cls) Object.ootCutsceneProperty = PointerProperty(type=OOTCutsceneProperty) + Scene.ootCSPreviewNodesReady = BoolProperty(default=False) + Scene.ootCSPreviewCSObj = PointerProperty(type=Object) def cutscene_props_unregister(): + del Scene.ootCSPreviewCSObj + del Scene.ootCSPreviewNodesReady del Object.ootCutsceneProperty for cls in reversed(classes): diff --git a/fast64_internal/oot/cutscene_docs.md b/fast64_internal/oot/cutscene_docs.md new file mode 100644 index 0000000..e22acb5 --- /dev/null +++ b/fast64_internal/oot/cutscene_docs.md @@ -0,0 +1,106 @@ +# Cutscene Documentation + +### Dictionnary +- Cutscene "Command/Commands": Cutscene "Commands" are macros that will tell the game what to do in your cutscene. It can be anything from stopping the cutscene at a certain frame, doing scene transitions or even manipulating Actors during the cutscene. The array containing the commands is called a cutscene "script". You can find more informations about each commands below. +- Camera "AT/Eye": AT means "look-at", it defines where the camera is looking, "Eye" is the position of the camera. For a person, "Eye" would be where they are and "AT" the object they are currently looking at. On Blender, the AT is a bone's tail and the Eye is a bone's head. +- "Spline": it's the movement the camera will follow. +- Actor "Cue": This is a system that triggers an Actor's code to make some action. Every Actor that has an implementation for this listens to the channel (defined by the "Actor Cue List" command) and will execute the action depending on the cue's action ID. This system is far from perfect, for instance two actors using the same channel will execute their actions at the same time. +- "Seq": Sequence, it refers to the audio (most of the time it's the background music) + +### Commands +More detailed informations and commands' parameters can be found [here](https://github.com/zeldaret/oot/blob/master/include/z64cutscene_commands.h) + +- ``CS_BEGIN_CUTSCENE``: defines the beginning of a cutscene script +- ``CS_END``: defines the end of a cutscene script +- ``CS_CAM_POINT``: defines a single camera point, it can be used with any of the "eye" or "at" camera commands +- ``CS_CAM_EYE``: defines a single eye point, this feature is not used in the final game and lacks polish +- ``CS_CAM_EYE_SPLINE``: declares a list of "eye" camera points that forms a spline +- ``CS_CAM_AT_SPLINE``: declares a list of "at" camera points that forms a spline +- ``CS_CAM_EYE_SPLINE_REL_TO_PLAYER`` and ``CS_CAM_AT_SPLINE_REL_TO_PLAYER``: same as the 2 above except these are relative to the player's position and yaw. +- ``CS_MISC_LIST``: declares a list of various miscellaneous commands, they're all self-explanatory, you can find the list [here](https://github.com/zeldaret/oot/blob/master/include/z64cutscene.h#L167-L204) +- ``CS_MISC``: defines a single misc command +- ``CS_LIGHT_SETTING_LIST``: declares a list of light settings commands +- ``CS_LIGHT_SETTING``: changes the light settings to the specified index, the lighting is defined in the scene +- ``CS_RUMBLE_CONTROLLER_LIST``: declares a list of controller rumble settings +- ``CS_RUMBLE_CONTROLLER``: makes the controller rumble, you can control the duration and the strength +- ``CS_ACTOR_CUE_LIST`` and ``CS_PLAYER_CUE_LIST``: declares an actor cue list, this also defines the channel to use (except for player cues) +- ``CS_ACTOR_CUE`` and ``CS_PLAYER_CUE``: defines the action to execute at the desired frame, also defines the position/rotation +- ``CS_TEXT_LIST``: declares a list of textboxes to display on-screen, when a textbox is present the cutscene won't continue until it's closed if the textbox isn't closing automatically +- ``CS_TEXT``: starts a textbox at the desired frame +- ``CS_TEXT_NONE``: +- ``CS_TEXT_OCARINA_ACTION``: defines an ocarina action, this is used when learning new songs during a cutscene +- ``CS_TRANSITION``: fills the screen with a single color to create transitions, "half" types are used in the intro cutscene to make that "night" effect in Link's house, "trigger instance" is used in the intro part where the Deku Tree talks to Navi to keep the screen white for the duration of the command +- ``CS_START_SEQ_LIST``: declares a list of ``CS_START_SEQ`` commands +- ``CS_START_SEQ``: starts a sequence +- ``CS_STOP_SEQ_LIST``: declares a list of ``CS_STOP_SEQ`` commands +- ``CS_STOP_SEQ``: stops a sequence +- ``CS_FADE_OUT_SEQ_LIST``: declares a list of ``CS_FADE_OUT_SEQ`` commands +- ``CS_FADE_OUT_SEQ``: fades out a sequence player on the specified frame range +- ``CS_TIME_LIST``: declares a list of ``CS_TIME`` commands +- ``CS_TIME``: changes the time of day to the specified hour and minute +- ``CS_DESTINATION``: defines a scene change (a new destination), specific destination types are doing other actions like changing the player's age or setting flags + +### Cutscene Motion with Fast64 +Fast64 has an implementation for creating camera shots and actor cues. + +- A camera shot is defined by an Armature object and the camera motion is defined by the armature's bones. Due to the game's spline algorithm for camera motion, you always need one more key point at each end, to define how the camera is moving when it approaches the last normal point. So, the minimum number of bones in the armature is 4, if you want the camera to move between the positions indicated by bones 2 to 3. + +When the shot / armature is selected, in the Object Properties pane there are controls for the start frame of that shot and whether it's normal, relative to Link, or the single Eye/AT point mode. When a particular key point / bone is selected, you have controls for the number of frames, view angle (FoV), and roll of the camera at that position. + +At export, camera shots are sorted by name, so you should name them with something they will be in the correct order with at export (e.g. Shot01, Shot02, etc.). The bones / key frames are also sorted by name, so their names must be in the order you want the motion to have. These should both be previewed correctly (i.e. if it looks right in Blender, it should work right in game) + +When you add a new bone by duplicating the last bone in the sequence, you must switch out of edit mode and back in for the previewer to properly handle that new bone. This only needs to be done after adding bones; you can preview while editing bones normally. This is due to how Blender represents bones differently in edit mode vs. object mode. + +- An Actor Cue list is defined by an empty object and child objects. The list object lets you control which the "command type" (defines the channel to use) and each child object defines the action ID. Those child objects are called "Actor Cue Point". Each cue's ending frame is defined by the next cue's starting frame. The next one also defines the end position of the previous cue, this is the design made by the original OoT devs that's why it can look a bit weird at first glance. + +### Details about the camera +Additional informations about the camera, you can skip reading this. This is ported from [zcamedit's readme](https://github.com/sauraen/zcamedit#details). + +The camera system in game is weird, this is partly why the previewer exists. If the previewer is not behaving as you expect, it's probably working correctly! (Of course if the behavior differs between Blender and in-game, please report a bug.) + +First of all, the system is based on four-point spline interpolation. This means, in the simplest case you have four values A-B-C-D, and the output changes from B to C over the duration, except with the initial trajectory based on A-B and with the final trajectory based on C-D so you get a nice curve. This is used separately to interpolate eye (camera position) and at (target look-at position) as well as camera roll and view angle. If you have more values (with the caveats below), the system will move through all the values except the start and end values. So basically you need an extra camera point at the beginning and at the end to set how the camera is starting and stopping. + +Now, the game's version of this is weird for two reasons: + +
+1. Continue flag checking bug +If you don't care about the coding and just want to make cutscenes, you don't have to worry about this, Fast64 takes care of it at import/export. Just make sure every cutscene command has at least 4 key points (bones). + +There is a bug (in the actual game) where when incrementing to the next set of key points, the key point which is checked for whether it's the last point or not is the last point of the new set, not the last point of the old set. This means that you always need an additional extra point at the end (except for the case of exactly four points, see below). This is in addition to the extra point at the end (and the one at the beginning) which are used for the spline interpolation to set how the camera behaves at the start or the end. No data whatsoever is read from this second extra point (except for the flag that it's the last point, which is set up automatically on export). + +For the case of 4 points, the camera motion from B to C works correctly, but when it gets to C, it reads the continue flag out of bounds (which will be an unspecified value). In most cases that byte won't be 0xFF, which means that on the following frame it will take the case for 1/2/3 points, and not initialize the camera position values at all, potentially leading to garbage values being used for them. + +So in summary: +- Command has 0 points: Will fail to export, but probably crash in game +- Command has 1/2/3 points: Command will immediately end; the position and look will be uninitialized values, whatever was last on the stack (may cause a floating-point exception) +- Command has 4 points: Works, but don't let the cutscene get to the end of this command +- Command has 5 points: Works as if it had 4 points +- Command has 6 points: Works as if it had 5 points +- Etc. + +Fast64 will automatically add this second extra point at the end on export, and also automatically remove the extra point at the end on import unless the command has only four points. +
+ +
+2. Frames interpolation +The number of frames actually spent between key points is interpolated in reciprocals and in a varying way between the key points. This makes predicting the number of frames actually spent extremely difficult unless the frames values are the same. In fact it's so difficult that this plugin actually just simulates the cutscene frame-by-frame up to the current frame every time the Blender frame changes, because solving for the position at some future time without actually stepping through all the frames up to there is too hard. + +Note: It's a discretized differential equation, if time was continuous, i.e. the frame rate was infinite, it could be solved with calculus, but since it moves in discrete steps at the frames, even the calculus solution would be only approximate. On top of that, when it changes from going between B-C and going between C-D, the initial position near C depends on what happened at B, and so on. + +You can think of it as it will spend *about* ``N frames`` around each key point. So, if the camera moves from point B to C but B has a larger ``frames`` value than C, the camera will move more slowly near B and more quickly near C. Also, a value of 0 means infinity, not zero, if C has ``frames=0`` the camera will approach C but never reach it. + +Only the ``frames`` values of points B and C affect the result when the camera is between B and C. So, the ``frames`` values of the one extra points at the beginning and the end (in this case A and D) can be arbitrary. + +The actual algorithm is: +- Compute the increment in ``t`` value (percentage of the way from point B to C) at point B by 1 / ``B.frames``, or 0 if ``B.frames`` is 0 +- Compute the increment in ``t`` value at point C by 1 / ``C.frames`` or 0. +- Linearly interpolate between these based on the current ``t`` value. +- Add this increment to ``t``. + +So you can think of it like, if ``B.frames`` is 10 and ``C.frames`` is 30, the camera moves 1/10th of the way from B to C per frame when it's at B, and 1/30th of the way from B to C per frame when it's nearly at C. But, when it's halfway between B and C, it doesn't move 1/20th of the way per frame, it moves (1/10)/2 + (1/30)/2 = 1/15th of the way. And on top of that, it will cross that positional halfway point less than half the total number of frames it actually takes to get from B to C. +
+ +### +There is also an ``endFrame`` parameter in the cutscene data, however it is almost useless, so it is not included as a custom property in the armature. The ``endFrame`` parameter does not end or stop the camera command, running out of key points or another camera command starting does. It's only checked when the camera command starts. In a normal cutscene where time starts from 0 and advances one frame at a time, as long as ``endFrame`` >= start_frame + 2, the command will work the same. + +So, this plugin just sets it to a "reasonable value" on export, and just asserted for validity on import. It seems the original developers' tool used the sum of all the points, including the second extra point, as the ``endFrame`` parameter for ``CS_CAM_AT_SPLINE``, and used the sum of all the points without the second extra point, plus 1, for the ``CS_CAM_EYE_SPLINE`` (oh yeah, did I mention they're different?), so Fast64 replicates this behavior. diff --git a/fast64_internal/oot/data/oot_data.py b/fast64_internal/oot/data/oot_data.py index 465707b..c4619a9 100644 --- a/fast64_internal/oot/data/oot_data.py +++ b/fast64_internal/oot/data/oot_data.py @@ -14,8 +14,10 @@ class OoT_Data: """Contains data related to OoT, like actors or objects""" def __init__(self): + from .oot_enum_data import OoT_EnumData from .oot_object_data import OoT_ObjectData from .oot_actor_data import OoT_ActorData + self.enumData = OoT_EnumData() self.objectData = OoT_ObjectData() self.actorData = OoT_ActorData() diff --git a/fast64_internal/oot/data/oot_enum_data.py b/fast64_internal/oot/data/oot_enum_data.py new file mode 100644 index 0000000..df5cf7e --- /dev/null +++ b/fast64_internal/oot/data/oot_enum_data.py @@ -0,0 +1,92 @@ +from dataclasses import dataclass, field +from os import path +from .oot_getters import getXMLRoot +from .oot_data import OoT_BaseElement + +# Note: "enumData" in this context refers to an OoT Object file (like ``gameplay_keep``) + + +@dataclass +class OoT_ItemElement(OoT_BaseElement): + pass + + +@dataclass +class OoT_EnumElement(OoT_BaseElement): + items: list[OoT_ItemElement] + itemByKey: dict[str, OoT_ItemElement] = field(default_factory=dict) + itemByIndex: dict[int, OoT_ItemElement] = field(default_factory=dict) + itemById: dict[int, OoT_ItemElement] = field(default_factory=dict) + + def __post_init__(self): + self.itemByKey = {item.key: item for item in self.items} + self.itemByIndex = {item.index: item for item in self.items} + self.itemById = {item.id: item for item in self.items} + + +class OoT_EnumData: + """Cutscene and misc enum data""" + + def __init__(self): + # general enumData list + self.enumDataList: list[OoT_EnumElement] = [] + + # Path to the ``EnumData.xml`` file + enumDataXML = path.dirname(path.abspath(__file__)) + "/xml/EnumData.xml" + enumDataRoot = getXMLRoot(enumDataXML) + + for enum in enumDataRoot.iterfind("Enum"): + self.enumDataList.append( + OoT_EnumElement( + enum.attrib["ID"], + enum.attrib["Key"], + None, + None, + [ + OoT_ItemElement( + item.attrib["ID"], + item.attrib["Key"], + item.attrib["ID"], + int(item.attrib["Index"]), + ) + for item in enum + ], + ) + ) + + # create list of tuples used by Blender's enum properties + self.deletedEntry = ("None", "(Deleted from the XML)", "None") + + self.ootEnumCsCmd: list[tuple[str, str, str]] = [] + self.ootEnumCsMiscType: list[tuple[str, str, str]] = [] + self.ootEnumCsTextType: list[tuple[str, str, str]] = [] + self.ootEnumCsFadeOutSeqPlayer: list[tuple[str, str, str]] = [] + self.ootEnumCsTransitionType: list[tuple[str, str, str]] = [] + self.ootEnumCsDestination: list[tuple[str, str, str]] = [] + self.ootEnumCsPlayerCueId: list[tuple[str, str, str]] = [] + self.ootEnumNaviQuestHintType: list[tuple[str, str, str]] = [] + + self.enumByID = {enum.id: enum for enum in self.enumDataList} + self.enumByKey = {enum.key: enum for enum in self.enumDataList} + + for key in self.enumByKey.keys(): + setattr(self, "ootEnum" + key[0].upper() + key[1:], self.getOoTEnumData(key)) + + def getOoTEnumData(self, enumKey: str): + enum = self.enumByKey[enumKey] + firstIndex = min(1, *(item.index for item in enum.items)) + lastIndex = max(1, *(item.index for item in enum.items)) + 1 + enumData = [self.deletedEntry] * lastIndex + custom = ("Custom", "Custom", "Custom") + + for item in enum.items: + if item.index < lastIndex: + identifier = item.key + enumData[item.index] = (identifier, item.name, item.id) + + if firstIndex > 0: + enumData[0] = custom + else: + enumData.insert(0, custom) + + return enumData diff --git a/fast64_internal/oot/data/xml/EnumData.xml b/fast64_internal/oot/data/xml/EnumData.xml new file mode 100644 index 0000000..9627768 --- /dev/null +++ b/fast64_internal/oot/data/xml/EnumData.xml @@ -0,0 +1,432 @@ + +

k-&%Vi{!PYs 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

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/fast64_internal/oot/oot_constants.py b/fast64_internal/oot/oot_constants.py index b456d59..022616a 100644 --- a/fast64_internal/oot/oot_constants.py +++ b/fast64_internal/oot/oot_constants.py @@ -98,7 +98,14 @@ ootEnumEmptyType = [ ("Water Box", "Water Box", "Water Box"), ("Cull Group", "Custom Cull Group", "Cull Group"), ("LOD", "LOD Group", "LOD Group"), - ("Cutscene", "Cutscene", "Cutscene"), + ("Cutscene", "Cutscene Main", "Cutscene"), + ("CS Actor Cue List", "CS Actor Cue List", "CS Actor Cue List"), + ("CS Actor Cue", "CS Actor Cue", "CS Actor Cue"), + ("CS Player Cue List", "CS Player Cue List", "CS Player Cue List"), + ("CS Player Cue", "CS Player Cue", "CS Player Cue"), + ("CS Actor Cue Preview", "CS Actor Cue Preview", "CS Actor Cue Preview"), + ("CS Player Cue Preview", "CS Player Cue Preview", "CS Player Cue Preview"), + ("CS Dummy Cue", "CS Dummy Cue", "CS Dummy Cue"), # ('Camera Volume', 'Camera Volume', 'Camera Volume'), ] diff --git a/fast64_internal/oot/oot_level_parser.py b/fast64_internal/oot/oot_level_parser.py index 887f090..51857ec 100644 --- a/fast64_internal/oot/oot_level_parser.py +++ b/fast64_internal/oot/oot_level_parser.py @@ -12,6 +12,7 @@ from .scene.exporter.to_c import getDrawConfig from .scene.properties import OOTSceneHeaderProperty, OOTLightProperty, OOTImportSceneSettingsProperty from .room.properties import OOTRoomHeaderProperty from .actor.properties import OOTActorProperty, OOTActorHeaderProperty +from .cutscene.motion.importer import importCutsceneData from .oot_utility import ( getHeaderSettings, @@ -147,6 +148,7 @@ class SharedSceneData: includeCameras: bool, includePaths: bool, includeWaterBoxes: bool, + includeCutscenes: bool, ): self.actorDict = {} # actor hash : blender object self.entranceDict = {} # actor hash : blender object @@ -162,6 +164,7 @@ class SharedSceneData: self.includeCameras = includeCameras self.includePaths = includePaths self.includeWaterBoxes = includeWaterBoxes + self.includeCutscenes = includeCutscenes def addHeaderIfItemExists(self, hash, itemType: str, headerIndex: int): if itemType == "Actor": @@ -216,7 +219,8 @@ def parseScene( importSubdir = os.path.dirname(getSceneDirFromLevelName(sceneName)) + "/" sceneFolderPath = ootGetPath(importPath, settings.isCustomDest, importSubdir, sceneName, False, True) - sceneData = readFile(os.path.join(sceneFolderPath, f"{sceneName}_scene.c")) + filePath = os.path.join(sceneFolderPath, f"{sceneName}_scene.c") + sceneData = readFile(filePath) # roomData = "" # sceneFolderFiles = [f for f in listdir(sceneFolderPath) if isfile(join(sceneFolderPath, f))] @@ -260,7 +264,12 @@ def parseScene( settings.includeCameras, settings.includePaths, settings.includeWaterBoxes, + settings.includeCutscenes, ) + + if settings.includeCutscenes: + bpy.context.scene.ootCSNumber = importCutsceneData(None, sceneData) + sceneObj = parseSceneCommands(sceneName, None, None, sceneCommandsName, sceneData, f3dContext, 0, sharedSceneData) bpy.context.scene.ootSceneExportObj = sceneObj @@ -363,9 +372,14 @@ def parseSceneCommands( if not (args[1] == "NULL" or args[1] == "0" or args[1] == "0x00"): lightsListName = stripName(args[1]) parseLightList(sceneObj, sceneHeader, sceneData, lightsListName, headerIndex) - elif command == "SCENE_CMD_CUTSCENE_DATA": - cutsceneName = args[0] - print("Cutscene command parsing not implemented.") + elif command == "SCENE_CMD_CUTSCENE_DATA" and sharedSceneData.includeCutscenes: + sceneHeader.writeCutscene = True + sceneHeader.csWriteType = "Object" + csObjName = f"Cutscene.{args[0]}" + try: + sceneHeader.csWriteObject = bpy.data.objects[csObjName] + except: + print(f"ERROR: Cutscene ``{csObjName}`` do not exist!") elif command == "SCENE_CMD_ALTERNATE_HEADER_LIST": # Delay until after rooms are parsed altHeadersListName = stripName(args[0]) diff --git a/fast64_internal/oot/oot_upgrade.py b/fast64_internal/oot/oot_upgrade.py index 33a5237..a5bdecd 100644 --- a/fast64_internal/oot/oot_upgrade.py +++ b/fast64_internal/oot/oot_upgrade.py @@ -1,5 +1,9 @@ +import bpy + from bpy.types import Object, CollectionProperty from .data import OoT_ObjectData +from .cutscene.motion.constants import ootEnumCSMotionCamMode +from .oot_constants import ootData def upgradeObjectList(objList: CollectionProperty, objData: OoT_ObjectData): @@ -34,3 +38,79 @@ def upgradeRoomHeaders(roomObj: Object, objData: OoT_ObjectData): upgradeObjectList(sceneLayer.objectList, objData) for i in range(len(altHeaders.cutsceneHeaders)): upgradeObjectList(altHeaders.cutsceneHeaders[i].objectList, objData) + + +def upgradeCutsceneMotion(csMotionObj: Object): + """Main upgrade logic for Cutscene Motion data from zcamedit""" + objName = csMotionObj.name + + if csMotionObj.type == "EMPTY": + csMotionProp = csMotionObj.ootCSMotionProperty + + if "zc_alist" in csMotionObj and ("Preview." in objName or "ActionList." in objName): + legacyData = csMotionObj["zc_alist"] + emptyTypeSuffix = "List" if "ActionList." in objName else "Preview" + csMotionObj.ootEmptyType = f"CS {'Player' if 'Link' in objName else 'Actor'} Cue {emptyTypeSuffix}" + + if "actor_id" in legacyData: + index = legacyData["actor_id"] + if index >= 0: + cmdEnum = ootData.enumData.enumByKey["csCmd"] + cmdType = cmdEnum.itemByIndex.get(index) + if cmdType is not None: + csMotionProp.actorCueListProp.commandType = cmdType.key + else: + csMotionProp.actorCueListProp.commandType = "Custom" + csMotionProp.actorCueListProp.commandTypeCustom = f"0x{index:04X}" + del legacyData["actor_id"] + + del csMotionObj["zc_alist"] + + if "zc_apoint" in csMotionObj and "Point." in objName: + isPlayer = "Link" in csMotionObj.parent.name + legacyData = csMotionObj["zc_apoint"] + csMotionObj.ootEmptyType = f"CS {'Player' if isPlayer else 'Actor'} Cue" + + if "start_frame" in legacyData: + csMotionProp.actorCueProp.cueStartFrame = legacyData["start_frame"] + del legacyData["start_frame"] + + if "action_id" in legacyData: + playerEnum = ootData.enumData.enumByKey["csPlayerCueId"] + item = None + if isPlayer: + item = playerEnum.itemByIndex.get(int(legacyData["action_id"], base=16)) + + if isPlayer and item is not None: + csMotionProp.actorCueProp.playerCueID = item.key + else: + csMotionProp.actorCueProp.cueActionID = legacyData["action_id"] + del legacyData["action_id"] + + del csMotionObj["zc_apoint"] + + if csMotionObj.type == "ARMATURE": + camShotProp = csMotionObj.data.ootCamShotProp + + if "start_frame" in csMotionObj.data: + camShotProp.shotStartFrame = csMotionObj.data["start_frame"] + del csMotionObj.data["start_frame"] + + if "cam_mode" in csMotionObj.data: + camShotProp.shotCamMode = ootEnumCSMotionCamMode[csMotionObj.data["cam_mode"]][0] + del csMotionObj.data["cam_mode"] + + for bone in csMotionObj.data.bones: + camShotPointProp = bone.ootCamShotPointProp + + if "frames" in bone: + camShotPointProp.shotPointFrame = bone["frames"] + del bone["frames"] + + if "fov" in bone: + camShotPointProp.shotPointViewAngle = bone["fov"] + del bone["fov"] + + if "camroll" in bone: + camShotPointProp.shotPointRoll = bone["camroll"] + del bone["camroll"] diff --git a/fast64_internal/oot/oot_utility.py b/fast64_internal/oot/oot_utility.py index 1d7ca39..b582f9c 100644 --- a/fast64_internal/oot/oot_utility.py +++ b/fast64_internal/oot/oot_utility.py @@ -1,5 +1,6 @@ import bpy, math, os, re from ast import parse, Expression, Num, UnaryOp, USub, Invert, BinOp +from bpy.types import Object from bpy.utils import register_class, unregister_class from typing import Callable from .oot_constants import ootSceneIDToName @@ -491,6 +492,13 @@ def getEnumName(enumItems, value): raise PluginError("Could not find enum value " + str(value)) +def getEnumIndex(enumItems, value): + for i, enumTuple in enumerate(enumItems): + if enumTuple[0] == value or enumTuple[1] == value: + return i + return None + + def ootConvertTranslation(translation): return [int(round(value)) for value in translation] @@ -501,7 +509,7 @@ def ootConvertRotation(rotation): # parse rotaion in Vec3s format -def ootParseRotation(values): +def ootParseRotation(values: list[int]): return [ math.radians( (int.from_bytes(value.to_bytes(2, "big", signed=value < 0x8000), "big", signed=False) / 2**16) * 360 diff --git a/fast64_internal/oot/props_panel_main.py b/fast64_internal/oot/props_panel_main.py index 39177fa..75730b5 100644 --- a/fast64_internal/oot/props_panel_main.py +++ b/fast64_internal/oot/props_panel_main.py @@ -7,6 +7,11 @@ from .scene.properties import OOTSceneProperties from .room.properties import OOTObjectProperty, OOTRoomHeaderProperty, OOTAlternateRoomHeaderProperty from .collision.properties import OOTWaterBoxProperty from .cutscene.properties import OOTCutsceneProperty +from .cutscene.motion.properties import ( + OOTCutsceneMotionProperty, + OOTCSMotionActorCueListProperty, + OOTCSMotionActorCueProperty, +) from .actor.properties import ( OOTActorProperty, @@ -144,6 +149,21 @@ class OOTObjectPanel(bpy.types.Panel): csProp: OOTCutsceneProperty = obj.ootCutsceneProperty csProp.draw_props(box, obj) + elif obj.ootEmptyType in [ + "CS Actor Cue List", + "CS Player Cue List", + "CS Actor Cue Preview", + "CS Player Cue Preview", + ]: + labelPrefix = "Player" if "Player" in obj.ootEmptyType else "Actor" + actorCueListProp: OOTCSMotionActorCueListProperty = obj.ootCSMotionProperty.actorCueListProp + actorCueListProp.draw_props(box, obj.ootEmptyType == f"CS {labelPrefix} Cue Preview", labelPrefix, obj.name) + + elif obj.ootEmptyType in ["CS Actor Cue", "CS Player Cue", "CS Dummy Cue"]: + labelPrefix = "Player" if obj.parent.ootEmptyType == "CS Player Cue List" else "Actor" + actorCueProp: OOTCSMotionActorCueProperty = obj.ootCSMotionProperty.actorCueProp + actorCueProp.draw_props(box, labelPrefix, obj.ootEmptyType == "CS Dummy Cue", obj.name) + elif obj.ootEmptyType == "None": box.label(text="Geometry can be parented to this.") @@ -154,9 +174,22 @@ class OOT_ObjectProperties(bpy.types.PropertyGroup): @staticmethod def upgrade_changed_props(): for obj in bpy.data.objects: - if obj.data is None: + if obj.type == "EMPTY": if obj.ootEmptyType == "Room": OOTObjectProperty.upgrade_object(obj) + if any(obj.name.startswith(elem) for elem in ["ActionList.", "Point.", "Preview."]): + OOTCutsceneMotionProperty.upgrade_object(obj) + + if "Point." in obj.name: + parentObj = obj.parent + if parentObj is not None: + if parentObj.children[-1] == obj: + obj.ootEmptyType = "CS Dummy Cue" + else: + print("WARNING: An Actor Cue has been detected outside an Actor Cue List: " + obj.name) + elif obj.type == "ARMATURE": + if obj.parent.name.startswith("Cutscene.") or obj.parent.ootEmptyType == "Cutscene": + OOTCutsceneMotionProperty.upgrade_object(obj) class OOTCullGroupProperty(bpy.types.PropertyGroup): diff --git a/fast64_internal/oot/room/properties.py b/fast64_internal/oot/room/properties.py index 1ad2c44..f75f52a 100644 --- a/fast64_internal/oot/room/properties.py +++ b/fast64_internal/oot/room/properties.py @@ -34,7 +34,7 @@ class OOTObjectProperty(PropertyGroup): objectIDCustom: StringProperty(default="OBJECT_CUSTOM") @staticmethod - def upgrade_object(obj): + def upgrade_object(obj: Object): print(f"Processing '{obj.name}'...") upgradeRoomHeaders(obj, ootData.objectData) diff --git a/fast64_internal/oot/scene/exporter/to_c/scene_commands.py b/fast64_internal/oot/scene/exporter/to_c/scene_commands.py index a972ee4..0df9e91 100644 --- a/fast64_internal/oot/scene/exporter/to_c/scene_commands.py +++ b/fast64_internal/oot/scene/exporter/to_c/scene_commands.py @@ -72,7 +72,7 @@ def getCutsceneDataCmd(outScene: OOTScene, headerIndex: int): case _: csDataName = outScene.csWriteCustom - return f"SCENE_CMD_CUTSCENE_DATA({csDataName})" + return indent + f"SCENE_CMD_CUTSCENE_DATA({csDataName})" def getSceneCommandList(outScene: OOTScene, headerIndex: int): diff --git a/fast64_internal/oot/scene/exporter/to_c/scene_cutscene.py b/fast64_internal/oot/scene/exporter/to_c/scene_cutscene.py index e182d9a..59a0dca 100644 --- a/fast64_internal/oot/scene/exporter/to_c/scene_cutscene.py +++ b/fast64_internal/oot/scene/exporter/to_c/scene_cutscene.py @@ -1,15 +1,23 @@ -from .....utility import CData, PluginError +from .....utility import CData, PluginError, indent from ....oot_level_classes import OOTScene from ....cutscene.constants import ootEnumCSTextboxTypeEntryC, ootEnumCSListTypeListC, ootEnumCSListTypeEntryC +from ....cutscene.motion.exporter import getCutsceneMotionData def ootCutsceneDataToC(csParent, csName): # csParent can be OOTCutscene or OOTScene + motionExporter = getCutsceneMotionData(csName, False) + motionData = motionExporter.getExportData() data = CData() data.header = "extern CutsceneData " + csName + "[];\n" data.source = "CutsceneData " + csName + "[] = {\n" nentries = len(csParent.csLists) + (1 if csParent.csWriteTerminator else 0) - data.source += "\tCS_BEGIN_CUTSCENE(" + str(nentries) + ", " + str(csParent.csEndFrame) + "),\n" + frameDiff = 0 + if motionExporter.frameCount > csParent.csEndFrame: + frameDiff = motionExporter.frameCount - csParent.csEndFrame + data.source += ( + indent + f"CS_BEGIN_CUTSCENE({nentries + motionExporter.entryTotal}, " + ) + f"{csParent.csEndFrame + frameDiff}),\n" if csParent.csWriteTerminator: data.source += ( "\tCS_TERMINATOR(" @@ -136,6 +144,7 @@ def ootCutsceneDataToC(csParent, csName): else: raise PluginError("Internal error: invalid cutscene list type " + list.listType) data.source += "),\n" + data.source += motionData data.source += "\tCS_END(),\n" data.source += "};\n\n" return data @@ -143,8 +152,14 @@ def ootCutsceneDataToC(csParent, csName): def getSceneCutscenes(outScene: OOTScene): cutscenes: list[CData] = [] - altHeaders = [outScene, outScene.childNightHeader, outScene.adultDayHeader, outScene.adultNightHeader] + altHeaders: list[OOTScene] = [ + outScene, + outScene.childNightHeader, + outScene.adultDayHeader, + outScene.adultNightHeader, + ] altHeaders.extend(outScene.cutsceneHeaders) + csObjects = [] for i, curHeader in enumerate(altHeaders): # curHeader is either None or an OOTScene. This can either be the main scene itself, @@ -152,10 +167,13 @@ def getSceneCutscenes(outScene: OOTScene): if curHeader is not None and curHeader.writeCutscene: if curHeader.csWriteType == "Embedded": cutscenes.append(ootCutsceneDataToC(curHeader, curHeader.cutsceneDataName(i))) - elif curHeader.csWriteType == "Object": + elif curHeader.csWriteType == "Object" and curHeader.csWriteObject.name not in csObjects: cutscenes.append(ootCutsceneDataToC(curHeader.csWriteObject, curHeader.csWriteObject.name)) + csObjects.append(curHeader.csWriteObject.name) for extraCs in outScene.extraCutscenes: - cutscenes.append(ootCutsceneDataToC(extraCs, extraCs.name)) + if not extraCs.name in csObjects: + cutscenes.append(ootCutsceneDataToC(extraCs, extraCs.name)) + csObjects.append(extraCs.name) return cutscenes diff --git a/fast64_internal/oot/scene/properties.py b/fast64_internal/oot/scene/properties.py index b81af4c..c7d243d 100644 --- a/fast64_internal/oot/scene/properties.py +++ b/fast64_internal/oot/scene/properties.py @@ -219,7 +219,11 @@ class OOTSceneTableEntryProperty(PropertyGroup): class OOTExtraCutsceneProperty(PropertyGroup): - csObject: PointerProperty(name="Cutscene Object", type=Object) + csObject: PointerProperty( + name="Cutscene Object", + type=Object, + poll=lambda self, object: object.type == "EMPTY" and object.ootEmptyType == "Cutscene", + ) class OOTSceneHeaderProperty(PropertyGroup): @@ -264,7 +268,11 @@ class OOTSceneHeaderProperty(PropertyGroup): writeCutscene: BoolProperty(name="Write Cutscene") csWriteType: EnumProperty(name="Cutscene Data Type", items=ootEnumCSWriteType, default="Embedded") csWriteCustom: StringProperty(name="CS hdr var:", default="") - csWriteObject: PointerProperty(name="Cutscene Object", type=Object) + csWriteObject: PointerProperty( + name="Cutscene Object", + type=Object, + poll=lambda self, object: object.type == "EMPTY" and object.ootEmptyType == "Cutscene", + ) # These properties are for the deprecated "Embedded" cutscene type. They have # not been removed as doing so would break any existing scenes made with this @@ -508,6 +516,7 @@ class OOTImportSceneSettingsProperty(PropertyGroup): includeCameras: BoolProperty(name="Cameras", default=True) includePaths: BoolProperty(name="Paths", default=True) includeWaterBoxes: BoolProperty(name="Water Boxes", default=True) + includeCutscenes: BoolProperty(name="Cutscenes", default=False) option: EnumProperty(items=ootEnumSceneID, default="SCENE_DEKU_TREE") def draw_props(self, layout: UILayout, sceneOption: str): @@ -515,17 +524,19 @@ class OOTImportSceneSettingsProperty(PropertyGroup): includeButtons1 = col.row(align=True) includeButtons1.prop(self, "includeMesh", toggle=1) includeButtons1.prop(self, "includeCollision", toggle=1) + includeButtons1.prop(self, "includeActors", toggle=1) includeButtons2 = col.row(align=True) - includeButtons2.prop(self, "includeActors", toggle=1) includeButtons2.prop(self, "includeCullGroups", toggle=1) includeButtons2.prop(self, "includeLights", toggle=1) + includeButtons2.prop(self, "includeCameras", toggle=1) includeButtons3 = col.row(align=True) - includeButtons3.prop(self, "includeCameras", toggle=1) includeButtons3.prop(self, "includePaths", toggle=1) includeButtons3.prop(self, "includeWaterBoxes", toggle=1) + includeButtons3.prop(self, "includeCutscenes", toggle=1) col.prop(self, "isCustomDest") + if self.isCustomDest: prop_split(col, self, "destPath", "Directory") prop_split(col, self, "name", "Name") @@ -534,8 +545,6 @@ class OOTImportSceneSettingsProperty(PropertyGroup): prop_split(col, self, "subFolder", "Subfolder") prop_split(col, self, "name", "Name") - col.label(text="Cutscenes won't be imported.") - if "SCENE_JABU_JABU" in sceneOption: col.label(text="Pulsing wall effect won't be imported.", icon="ERROR") diff --git a/fast64_internal/oot/tools/operators.py b/fast64_internal/oot/tools/operators.py index 03b73e1..6e5f1df 100644 --- a/fast64_internal/oot/tools/operators.py +++ b/fast64_internal/oot/tools/operators.py @@ -1,9 +1,12 @@ +import bpy + from mathutils import Vector from bpy.ops import mesh, object, curve -from bpy.types import Operator +from bpy.types import Operator, Object, Context from bpy.props import FloatProperty, StringProperty from ...operators import AddWaterBox, addMaterialByName from ...utility import parentObject, setOrigin +from ..cutscene.motion.utility import setupCutscene, createNewCameraShot class OOT_AddWaterBox(AddWaterBox): @@ -143,7 +146,9 @@ class OOT_AddRoom(Operator): class OOT_AddCutscene(Operator): bl_idname = "object.oot_add_cutscene" bl_label = "Add Cutscene" - bl_options = {"REGISTER", "UNDO", "PRESET"} + bl_options = {"REGISTER", "UNDO"} + + csName: StringProperty(name="", default="Something", description="The Cutscene's Name without `Cutscene.`") def execute(self, context): if context.mode != "OBJECT": @@ -153,13 +158,25 @@ class OOT_AddCutscene(Operator): object.empty_add(type="ARROWS", radius=1, align="WORLD") csObj = context.view_layer.objects.active csObj.ootEmptyType = "Cutscene" - csObj.name = "Cutscene.Something" + csObj.name = f"Cutscene.{self.csName}" + createNewCameraShot(csObj) + setupCutscene(csObj) object.select_all(action="DESELECT") csObj.select_set(True) context.view_layer.objects.active = csObj return {"FINISHED"} + def invoke(self, context, event): + return context.window_manager.invoke_props_dialog(self, width=200) + + def draw(self, context): + layout = self.layout + layout.label(text="Set the Cutscene's Name") + split = layout.split(factor=0.30) + split.label(text="Cutscene.") + split.prop(self, "csName") + class OOT_AddPath(Operator): bl_idname = "object.oot_add_path" @@ -180,3 +197,34 @@ class OOT_AddPath(Operator): pathObj.select_set(True) context.view_layer.objects.active = pathObj return {"FINISHED"} + + +class OOTClearTransformAndLock(Operator): + bl_idname = "object.oot_clear_transform" + bl_label = "Clear Transform (Scenes & Cutscenes)" + bl_options = {"REGISTER", "UNDO"} + + def clearTransform(self, obj: Object): + print(obj.name) + prevSelect = obj.select_get() + obj.select_set(True) + object.location_clear() + object.rotation_clear() + object.scale_clear() + object.origin_clear() + if obj.type != "EMPTY": + object.transform_apply(location=True, rotation=True, scale=True) + obj.select_set(prevSelect) + + def execute(self, context: Context): + try: + for obj in bpy.data.objects: + if obj.type == "EMPTY": + if obj.ootEmptyType in ["Scene", "Cutscene"]: + self.clearTransform(obj) + for childObj in obj.children_recursive: + self.clearTransform(childObj) + self.report({"INFO"}, "Success!") + return {"FINISHED"} + except: + return {"CANCELLED"} diff --git a/fast64_internal/oot/tools/panel.py b/fast64_internal/oot/tools/panel.py index 1e51517..759e109 100644 --- a/fast64_internal/oot/tools/panel.py +++ b/fast64_internal/oot/tools/panel.py @@ -7,6 +7,7 @@ from .operators import ( OOT_AddRoom, OOT_AddCutscene, OOT_AddPath, + OOTClearTransformAndLock, ) @@ -22,6 +23,7 @@ class OoT_ToolsPanel(OOT_Panel): col.operator(OOT_AddRoom.bl_idname) col.operator(OOT_AddCutscene.bl_idname) col.operator(OOT_AddPath.bl_idname) + col.operator(OOTClearTransformAndLock.bl_idname) oot_operator_panel_classes = [ @@ -35,6 +37,7 @@ toolOpsToRegister = [ OOT_AddRoom, OOT_AddCutscene, OOT_AddPath, + OOTClearTransformAndLock, ] From 9a67d802e9cdeeeac64d5db88ee74963e10c92bd Mon Sep 17 00:00:00 2001 From: Sauraen Date: Wed, 18 Oct 2023 21:53:54 -0700 Subject: [PATCH 32/74] Removed hardware v1 support, cleaned up some othermode code --- __init__.py | 9 +- fast64_internal/f3d/f3d_gbi.py | 214 +++++++--------------- fast64_internal/f3d/f3d_material.py | 16 +- fast64_internal/f3d/f3d_texture_writer.py | 36 +--- fast64_internal/f3d/f3d_writer.py | 89 +++------ 5 files changed, 105 insertions(+), 259 deletions(-) diff --git a/__init__.py b/__init__.py index 0bcd23f..586577a 100644 --- a/__init__.py +++ b/__init__.py @@ -161,7 +161,6 @@ class F3D_GlobalSettingsPanel(bpy.types.Panel): col = self.layout.column() col.scale_y = 1.1 # extra padding prop_split(col, context.scene, "f3d_type", "F3D Microcode") - col.prop(context.scene, "isHWv1") col.prop(context.scene, "saveTextures") col.prop(context.scene, "f3d_simple", text="Simple Material UI") col.prop(context.scene, "generateF3DNodeGraph", text="Generate F3D Node Graph For Materials") @@ -427,7 +426,6 @@ def gameEditorUpdate(self, context): # register operators and panels here # append menu layout drawing function to an existing window def register(): - if bpy.app.version < (3, 2, 0): msg = "\n".join( ( @@ -472,8 +470,11 @@ def register(): bpy.types.Scene.saveTextures = bpy.props.BoolProperty(name="Save Textures As PNGs (Breaks CI Textures)") bpy.types.Scene.generateF3DNodeGraph = bpy.props.BoolProperty(name="Generate F3D Node Graph", default=True) bpy.types.Scene.exportHiddenGeometry = bpy.props.BoolProperty(name="Export Hidden Geometry", default=True) - bpy.types.Scene.exportInlineF3D = bpy.props.BoolProperty(name="Bleed and Inline Material Exports", \ - description = "Inlines and bleeds materials in a single mesh. GeoLayout + Armature exports bleed over entire model", default=False) + bpy.types.Scene.exportInlineF3D = bpy.props.BoolProperty( + name="Bleed and Inline Material Exports", + description="Inlines and bleeds materials in a single mesh. GeoLayout + Armature exports bleed over entire model", + default=False, + ) bpy.types.Scene.blenderF3DScale = bpy.props.FloatProperty( name="F3D Blender Scale", default=100, update=on_update_render_settings ) diff --git a/fast64_internal/f3d/f3d_gbi.py b/fast64_internal/f3d/f3d_gbi.py index f40b0a6..4e70e54 100644 --- a/fast64_internal/f3d/f3d_gbi.py +++ b/fast64_internal/f3d/f3d_gbi.py @@ -131,11 +131,13 @@ def isUcodeF3DEX3(F3D_VER: str) -> bool: class F3D: """NOTE: do not initialize this class manually! use get_F3D_GBI so that the single instance is cached from the microcode type.""" - def __init__(self, F3D_VER, _HW_VERSION_1): + def __init__(self, F3D_VER): + self.F3D_VER = F3D_VER F3DEX_GBI = self.F3DEX_GBI = isUcodeF3DEX1(F3D_VER) F3DEX_GBI_2 = self.F3DEX_GBI_2 = isUcodeF3DEX2(F3D_VER) F3DEX_GBI_3 = self.F3DEX_GBI_3 = isUcodeF3DEX3(F3D_VER) F3DLP_GBI = self.F3DLP_GBI = self.F3DEX_GBI + self.F3D_OLD_GBI = not (F3DEX_GBI or F3DEX_GBI_2 or F3DEX_GBI_3) # F3DEX2 is F3DEX1 and F3DEX3 is F3DEX2, but F3DEX3 is not F3DEX1 if F3DEX_GBI_2: @@ -148,12 +150,6 @@ class F3D: self.G_MAX_LIGHTS = 9 if F3DEX_GBI_3 else 7 self.G_INPUT_BUFFER_CMDS = 21 - self._HW_VERSION_1 = _HW_VERSION_1 - self.F3D_VER = F3D_VER - # self._LANGUAGE_ASSEMBLY = _LANGUAGE_ASSEMBLY - - self.HAS_TRI2 = F3DEX_GBI or F3DEX_GBI_2 or F3DEX_GBI_3 - if F3DEX_GBI_2: self.G_NOOP = 0x00 self.G_RDPHALF_2 = 0xF1 @@ -282,13 +278,9 @@ class F3D: self.G_RDP_TRI_TXTR_MASK = 0x02 self.G_RDP_TRI_ZBUFF_MASK = 0x01 - self.BOWTIE_VAL = 0 - # gets added to RDP command, in order to test for addres fixup self.G_RDP_ADDR_FIXUP = 3 # |RDP cmds| <= this, do addr fixup - # if _LANGUAGE_ASSEMBLY: self.G_RDP_TEXRECT_CHECK = (-1 * self.G_TEXRECTFLIP) & 0xFF - # endif self.G_DMACMDSIZ = 128 self.G_IMMCMDSIZ = 64 @@ -379,7 +371,6 @@ class F3D: "G_FRESNEL", } - # if _LANGUAGE_ASSEMBLY: self.G_FOG_H = self.G_FOG / 0x10000 self.G_LIGHTING_H = self.G_LIGHTING / 0x10000 self.G_TEXTURE_GEN_H = self.G_TEXTURE_GEN / 0x10000 @@ -387,10 +378,8 @@ class F3D: self.G_LOD_H = self.G_LOD / 0x10000 # NOT IMPLEMENTED if F3DEX_GBI or F3DLP_GBI: self.G_CLIPPING_H = self.G_CLIPPING / 0x10000 - # endif # Need these defined for Sprite Microcode - # if _LANGUAGE_ASSEMBLY: self.G_TX_LOADTILE = 7 self.G_TX_RENDERTILE = 0 @@ -400,7 +389,6 @@ class F3D: self.G_TX_CLAMP = 0x2 self.G_TX_NOMASK = 0 self.G_TX_NOLOD = 0 - # endif self.G_TX_VARS = { "G_TX_NOMIRROR": 0, @@ -735,13 +723,8 @@ class F3D: self.G_CD_MAGICSQ = 0 << G_MDSFT_RGBDITHER self.G_CD_BAYER = 1 << G_MDSFT_RGBDITHER self.G_CD_NOISE = 2 << G_MDSFT_RGBDITHER - - if not _HW_VERSION_1: - self.G_CD_DISABLE = 3 << G_MDSFT_RGBDITHER - self.G_CD_ENABLE = self.G_CD_NOISE # HW 1.0 compatibility mode - else: - self.G_CD_ENABLE = 1 << G_MDSFT_COLORDITHER - self.G_CD_DISABLE = 0 << G_MDSFT_COLORDITHER + self.G_CD_DISABLE = 3 << G_MDSFT_RGBDITHER + self.G_CD_ENABLE = self.G_CD_NOISE # G_SETOTHERMODE_H gSetAlphaDither self.G_AD_PATTERN = 0 << G_MDSFT_ALPHADITHER @@ -1672,10 +1655,7 @@ class F3D: tile manipulation yourself. RJM. """ - if _HW_VERSION_1: - self.G_TX_LDBLK_MAX_TXL = 4095 - else: - self.G_TX_LDBLK_MAX_TXL = 2047 + self.G_TX_LDBLK_MAX_TXL = 2047 if not F3DEX_GBI_3: # Clipping Macros @@ -1760,21 +1740,23 @@ class F3D: return (self.G_INPUT_BUFFER_CMDS - remainderCommands) << 3 -g_F3D = {"GBI": None, "f3d_type": None, "isHWv1": None} +g_F3D = { + "GBI": None, + "f3d_type": None, +} -def get_cached_F3D_GBI(f3d_type: str, isHWv1: bool) -> F3D: +def get_cached_F3D_GBI(f3d_type: str) -> F3D: """Get constructed/cached F3D class""" - if g_F3D["GBI"] is None or f3d_type != g_F3D["f3d_type"] or isHWv1 != g_F3D["isHWv1"]: + if g_F3D["GBI"] is None or f3d_type != g_F3D["f3d_type"]: g_F3D["f3d_type"] = f3d_type - g_F3D["isHWv1"] = isHWv1 - g_F3D["GBI"] = F3D(f3d_type, isHWv1) + g_F3D["GBI"] = F3D(f3d_type) return g_F3D["GBI"] def get_F3D_GBI() -> F3D: """Gets cached F3D class and automatically supplies params""" - return get_cached_F3D_GBI(bpy.context.scene.f3d_type, bpy.context.scene.isHWv1) + return get_cached_F3D_GBI(bpy.context.scene.f3d_type) def _SHIFTL(value, amount, mask): @@ -4085,7 +4067,6 @@ class SPTexture(GbiMacro): if f3d.F3DEX_GBI_2: words = ( _SHIFTL(f3d.G_TEXTURE, 24, 8) - | _SHIFTL(f3d.BOWTIE_VAL, 16, 8) | _SHIFTL((self.level), 11, 3) | _SHIFTL((self.tile), 8, 3) | _SHIFTL((self.on), 1, 7) @@ -4093,7 +4074,6 @@ class SPTexture(GbiMacro): else: words = ( _SHIFTL(f3d.G_TEXTURE, 24, 8) - | _SHIFTL(f3d.BOWTIE_VAL, 16, 8) | _SHIFTL((self.level), 11, 3) | _SHIFTL((self.tile), 8, 3) | _SHIFTL((self.on), 0, 8) @@ -4352,24 +4332,17 @@ class DPSetColorDither(GbiMacro): mode: str def to_binary(self, f3d, segments): - if not f3d._HW_VERSION_1: - if self.mode == "G_CD_MAGICSQ": - modeVal = f3d.G_CD_MAGICSQ - elif self.mode == "G_CD_BAYER": - modeVal = f3d.G_CD_BAYER - elif self.mode == "G_CD_NOISE": - modeVal = f3d.G_CD_NOISE - elif self.mode == "G_CD_DISABLE": - modeVal = f3d.G_CD_DISABLE - elif self.mode == "G_CD_ENABLE": - modeVal = f3d.G_CD_ENABLE - return gsSPSetOtherMode(f3d.G_SETOTHERMODE_H, f3d.G_MDSFT_RGBDITHER, 2, modeVal, f3d) - else: - if self.mode == "G_CD_ENABLE": - modeVal = f3d.G_CD_ENABLE - elif self.mode == "G_CD_DISABLE": - modeVal = f3d.G_CD_DISABLE - return gsSPSetOtherMode(f3d.G_SETOTHERMODE_H, f3d.G_MDSFT_COLORDITHER, 1, modeVal, f3d) + if self.mode == "G_CD_MAGICSQ": + modeVal = f3d.G_CD_MAGICSQ + elif self.mode == "G_CD_BAYER": + modeVal = f3d.G_CD_BAYER + elif self.mode == "G_CD_NOISE": + modeVal = f3d.G_CD_NOISE + elif self.mode == "G_CD_DISABLE": + modeVal = f3d.G_CD_DISABLE + elif self.mode == "G_CD_ENABLE": + modeVal = f3d.G_CD_ENABLE + return gsSPSetOtherMode(f3d.G_SETOTHERMODE_H, f3d.G_MDSFT_RGBDITHER, 2, modeVal, f3d) @dataclass(unsafe_hash=True) @@ -4378,18 +4351,15 @@ class DPSetAlphaDither(GbiMacro): mode: str def to_binary(self, f3d, segments): - if not f3d._HW_VERSION_1: - if self.mode == "G_AD_PATTERN": - modeVal = f3d.G_AD_PATTERN - elif self.mode == "G_AD_NOTPATTERN": - modeVal = f3d.G_AD_NOTPATTERN - elif self.mode == "G_AD_NOISE": - modeVal = f3d.G_AD_NOISE - elif self.mode == "G_AD_DISABLE": - modeVal = f3d.G_AD_DISABLE - return gsSPSetOtherMode(f3d.G_SETOTHERMODE_H, f3d.G_MDSFT_ALPHADITHER, 2, modeVal, f3d) - else: - raise PluginError("SetAlphaDither not available in HW v1.") + if self.mode == "G_AD_PATTERN": + modeVal = f3d.G_AD_PATTERN + elif self.mode == "G_AD_NOTPATTERN": + modeVal = f3d.G_AD_NOTPATTERN + elif self.mode == "G_AD_NOISE": + modeVal = f3d.G_AD_NOISE + elif self.mode == "G_AD_DISABLE": + modeVal = f3d.G_AD_DISABLE + return gsSPSetOtherMode(f3d.G_SETOTHERMODE_H, f3d.G_MDSFT_ALPHADITHER, 2, modeVal, f3d) @dataclass(unsafe_hash=True) @@ -5291,39 +5261,19 @@ class DPLoadTLUT_pal16(GbiMacro): _ptr_amp = True # adds & to name of image def to_binary(self, f3d, segments): - if not f3d._HW_VERSION_1: - return ( - DPSetTextureImage("G_IM_FMT_RGBA", "G_IM_SIZ_16b", 1, self.dram).to_binary(f3d, segments) - + DPTileSync().to_binary(f3d, segments) - + DPSetTile( - "0", "0", 0, (256 + (((self.pal) & 0xF) * 16)), f3d.G_TX_LOADTILE, 0, 0, 0, 0, 0, 0, 0 - ).to_binary(f3d, segments) - + DPLoadSync().to_binary(f3d, segments) - + DPLoadTLUTCmd(f3d.G_TX_LOADTILE, 15).to_binary(f3d, segments) - + DPPipeSync().to_binary(f3d, segments) - ) - else: - return _DPLoadTextureBlock( - self.dram, - (256 + (((self.pal) & 0xF) * 16)), - f3d.G_IM_FMT_VARS["G_IM_FMT_RGBA"], - f3d.G_IM_SIZ_VARS["G_IM_SIZ_16b"], - 4 * 16, - 1, - self.pal, - 0, - 0, - 0, - 0, - 0, - 0, + return ( + DPSetTextureImage("G_IM_FMT_RGBA", "G_IM_SIZ_16b", 1, self.dram).to_binary(f3d, segments) + + DPTileSync().to_binary(f3d, segments) + + DPSetTile( + "0", "0", 0, (256 + (((self.pal) & 0xF) * 16)), f3d.G_TX_LOADTILE, 0, 0, 0, 0, 0, 0, 0 ).to_binary(f3d, segments) + + DPLoadSync().to_binary(f3d, segments) + + DPLoadTLUTCmd(f3d.G_TX_LOADTILE, 15).to_binary(f3d, segments) + + DPPipeSync().to_binary(f3d, segments) + ) def size(self, f3d): - if not f3d._HW_VERSION_1: - return GFX_SIZE * 6 - else: - return GFX_SIZE * 7 + return GFX_SIZE * 6 @dataclass(unsafe_hash=True) @@ -5332,37 +5282,17 @@ class DPLoadTLUT_pal256(GbiMacro): _ptr_amp = True # adds & to name of image def to_binary(self, f3d, segments): - if not f3d._HW_VERSION_1: - return ( - DPSetTextureImage("G_IM_FMT_RGBA", "G_IM_SIZ_16b", 1, self.dram).to_binary(f3d, segments) - + DPTileSync().to_binary(f3d, segments) - + DPSetTile("0", "0", 0, 256, f3d.G_TX_LOADTILE, 0, 0, 0, 0, 0, 0, 0).to_binary(f3d, segments) - + DPLoadSync().to_binary(f3d, segments) - + DPLoadTLUTCmd(f3d.G_TX_LOADTILE, 255).to_binary(f3d, segments) - + DPPipeSync().to_binary(f3d, segments) - ) - else: - return _DPLoadTextureBlock( - self.dram, - 256, - f3d.G_IM_FMT_VARS["G_IM_FMT_RGBA"], - f3d.G_IM_SIZ_VARS["G_IM_SIZ_16b"], - 4 * 256, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - ).to_binary(f3d, segments) + return ( + DPSetTextureImage("G_IM_FMT_RGBA", "G_IM_SIZ_16b", 1, self.dram).to_binary(f3d, segments) + + DPTileSync().to_binary(f3d, segments) + + DPSetTile("0", "0", 0, 256, f3d.G_TX_LOADTILE, 0, 0, 0, 0, 0, 0, 0).to_binary(f3d, segments) + + DPLoadSync().to_binary(f3d, segments) + + DPLoadTLUTCmd(f3d.G_TX_LOADTILE, 255).to_binary(f3d, segments) + + DPPipeSync().to_binary(f3d, segments) + ) def size(self, f3d): - if not f3d._HW_VERSION_1: - return GFX_SIZE * 6 - else: - return GFX_SIZE * 7 + return GFX_SIZE * 6 @dataclass(unsafe_hash=True) @@ -5373,37 +5303,17 @@ class DPLoadTLUT(GbiMacro): _ptr_amp = True # adds & to name of image def to_binary(self, f3d, segments): - if not f3d._HW_VERSION_1: - return ( - DPSetTextureImage("G_IM_FMT_RGBA", "G_IM_SIZ_16b", 1, self.dram).to_binary(f3d, segments) - + DPTileSync().to_binary(f3d, segments) - + DPSetTile("0", "0", 0, self.tmemaddr, f3d.G_TX_LOADTILE, 0, 0, 0, 0, 0, 0, 0).to_binary(f3d, segments) - + DPLoadSync().to_binary(f3d, segments) - + DPLoadTLUTCmd(f3d.G_TX_LOADTILE, self.count - 1).to_binary(f3d, segments) - + DPPipeSync().to_binary(f3d, segments) - ) - else: - return _DPLoadTextureBlock( - self.dram, - self.tmemaddr, - f3d.G_IM_FMT_VARS["G_IM_FMT_RGBA"], - f3d.G_IM_SIZ_VARS["G_IM_SIZ_16b"], - 4, - self.count, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - ).to_binary(f3d, segments) + return ( + DPSetTextureImage("G_IM_FMT_RGBA", "G_IM_SIZ_16b", 1, self.dram).to_binary(f3d, segments) + + DPTileSync().to_binary(f3d, segments) + + DPSetTile("0", "0", 0, self.tmemaddr, f3d.G_TX_LOADTILE, 0, 0, 0, 0, 0, 0, 0).to_binary(f3d, segments) + + DPLoadSync().to_binary(f3d, segments) + + DPLoadTLUTCmd(f3d.G_TX_LOADTILE, self.count - 1).to_binary(f3d, segments) + + DPPipeSync().to_binary(f3d, segments) + ) def size(self, f3d): - if not f3d._HW_VERSION_1: - return GFX_SIZE * 6 - else: - return GFX_SIZE * 7 + return GFX_SIZE * 6 # gsDPSetScissor diff --git a/fast64_internal/f3d/f3d_material.py b/fast64_internal/f3d/f3d_material.py index 605f803..27990d8 100644 --- a/fast64_internal/f3d/f3d_material.py +++ b/fast64_internal/f3d/f3d_material.py @@ -558,11 +558,8 @@ def ui_upper_mode(settings, dataHolder, layout: UILayout, useDropdown): icon="TRIA_DOWN" if dataHolder.menu_upper else "TRIA_RIGHT", ) if not useDropdown or dataHolder.menu_upper: - if not bpy.context.scene.isHWv1: - prop_split(inputGroup, settings, "g_mdsft_alpha_dither", "Alpha Dither") - prop_split(inputGroup, settings, "g_mdsft_rgb_dither", "RGB Dither") - else: - prop_split(inputGroup, settings, "g_mdsft_color_dither", "Color Dither") + prop_split(inputGroup, settings, "g_mdsft_alpha_dither", "Alpha Dither") + prop_split(inputGroup, settings, "g_mdsft_rgb_dither", "RGB Dither") prop_split(inputGroup, settings, "g_mdsft_combkey", "Chroma Key") prop_split(inputGroup, settings, "g_mdsft_textconv", "Texture Convert") prop_split(inputGroup, settings, "g_mdsft_text_filt", "Texture Filter") @@ -4100,15 +4097,6 @@ def mat_register(): items=enumF3D, default="F3D", ) - Scene.isHWv1 = bpy.props.BoolProperty( - name="Is Hardware v1?", - default=False, - description=( - "Only early N64 devkits have V1 RCP chips; all retail consoles have V2. " - + "Display lists made for V1 and V2 are incompatible with each other, " - + "so any hardware which can play retail games is V2" - ), - ) # RDP Defaults World.rdp_defaults = bpy.props.PointerProperty(type=RDPSettings) diff --git a/fast64_internal/f3d/f3d_texture_writer.py b/fast64_internal/f3d/f3d_texture_writer.py index 9c93c64..1671f7a 100644 --- a/fast64_internal/f3d/f3d_texture_writer.py +++ b/fast64_internal/f3d/f3d_texture_writer.py @@ -1061,35 +1061,13 @@ def savePaletteLoad( assert 0 <= palAddr < 256 and (palAddr & 0xF) == 0 palFmt = texFormatOf[palFormat] nocm = ["G_TX_WRAP", "G_TX_NOMIRROR"] - - if not f3d._HW_VERSION_1: - gfxOut.commands.extend( - [ - DPSetTextureImage(palFmt, "G_IM_SIZ_16b", 1, fPalette), - DPSetTile("0", "0", 0, 256 + palAddr, loadtile, 0, nocm, 0, 0, nocm, 0, 0), - DPLoadTLUTCmd(loadtile, palLen - 1), - ] - ) - else: - gfxOut.commands.extend( - [ - _DPLoadTextureBlock( - fPalette, - 256 + palAddr, - palFmt, - "G_IM_SIZ_16b", - 4 * palLen, - 1, - 0, - nocm, - nocm, - 0, - 0, - 0, - 0, - ) - ] - ) + gfxOut.commands.extend( + [ + DPSetTextureImage(palFmt, "G_IM_SIZ_16b", 1, fPalette), + DPSetTile("0", "0", 0, 256 + palAddr, loadtile, 0, nocm, 0, 0, nocm, 0, 0), + DPLoadTLUTCmd(loadtile, palLen - 1), + ] + ) # Functions for converting and writing texture and palette data diff --git a/fast64_internal/f3d/f3d_writer.py b/fast64_internal/f3d/f3d_writer.py index ad18f1e..cb50f01 100644 --- a/fast64_internal/f3d/f3d_writer.py +++ b/fast64_internal/f3d/f3d_writer.py @@ -897,7 +897,9 @@ class TriangleConverter: # Load triangles self.triList.commands.extend( - createTriangleCommands(self.vertexBufferTriangles, self.vertBuffer, self.triConverterInfo.f3d.HAS_TRI2) + createTriangleCommands( + self.vertexBufferTriangles, self.vertBuffer, not self.triConverterInfo.f3d.F3D_OLD_GBI + ) ) def addFace(self, face, stOffset): @@ -1203,7 +1205,6 @@ def saveOrGetF3DMaterial(material, fModel, obj, drawLayer, convertTextureData): f3dMat.rdp_settings, multitexManager.getTT(), defaults, - fModel.f3d._HW_VERSION_1, fModel.matWriteMethod, fModel.f3d, ) @@ -1428,22 +1429,20 @@ def saveModeSetting(fMaterial, value, defaultValue, cmdClass): fMaterial.revert.commands.append(cmdClass(defaultValue)) -def saveOtherModeHDefinition(fMaterial, settings, tlut, defaults, isHWv1, matWriteMethod, f3d): +def saveOtherModeHDefinition(fMaterial, settings, tlut, defaults, matWriteMethod, f3d): if matWriteMethod == GfxMatWriteMethod.WriteAll: - saveOtherModeHDefinitionAll(fMaterial, settings, tlut, defaults, isHWv1, f3d) + saveOtherModeHDefinitionAll(fMaterial, settings, tlut, defaults, f3d) elif matWriteMethod == GfxMatWriteMethod.WriteDifferingAndRevert: - saveOtherModeHDefinitionIndividual(fMaterial, settings, tlut, defaults, isHWv1) + saveOtherModeHDefinitionIndividual(fMaterial, settings, tlut, defaults) else: raise PluginError("Unhandled material write method: " + str(matWriteMethod)) -def saveOtherModeHDefinitionAll(fMaterial, settings, tlut, defaults, isHWv1, f3d): - is_f3d_old = all((not f3d.F3DEX_GBI, not f3d.F3DEX_GBI_2, not f3d.F3DLP_GBI)) - cmd = SPSetOtherMode("G_SETOTHERMODE_H", 4, 20 - is_f3d_old, []) +def saveOtherModeHDefinitionAll(fMaterial, settings, tlut, defaults, f3d): + cmd = SPSetOtherMode("G_SETOTHERMODE_H", 4, 20 - f3d.F3D_OLD_GBI, []) cmd.flagList.append(settings.g_mdsft_alpha_dither) - if not isHWv1: - cmd.flagList.append(settings.g_mdsft_rgb_dither) - cmd.flagList.append(settings.g_mdsft_combkey) + cmd.flagList.append(settings.g_mdsft_rgb_dither) + cmd.flagList.append(settings.g_mdsft_combkey) cmd.flagList.append(settings.g_mdsft_textconv) cmd.flagList.append(settings.g_mdsft_text_filt) cmd.flagList.append(tlut) @@ -1451,18 +1450,15 @@ def saveOtherModeHDefinitionAll(fMaterial, settings, tlut, defaults, isHWv1, f3d cmd.flagList.append(settings.g_mdsft_textdetail) cmd.flagList.append(settings.g_mdsft_textpersp) cmd.flagList.append(settings.g_mdsft_cycletype) - if isHWv1: - cmd.flagList.append(settings.g_mdsft_color_dither) cmd.flagList.append(settings.g_mdsft_pipeline) fMaterial.mat_only_DL.commands.append(cmd) -def saveOtherModeHDefinitionIndividual(fMaterial, settings, tlut, defaults, isHWv1): +def saveOtherModeHDefinitionIndividual(fMaterial, settings, tlut, defaults): saveModeSetting(fMaterial, settings.g_mdsft_alpha_dither, defaults.g_mdsft_alpha_dither, DPSetAlphaDither) - if not isHWv1: - saveModeSetting(fMaterial, settings.g_mdsft_rgb_dither, defaults.g_mdsft_rgb_dither, DPSetColorDither) - saveModeSetting(fMaterial, settings.g_mdsft_combkey, defaults.g_mdsft_combkey, DPSetCombineKey) + saveModeSetting(fMaterial, settings.g_mdsft_rgb_dither, defaults.g_mdsft_rgb_dither, DPSetColorDither) + saveModeSetting(fMaterial, settings.g_mdsft_combkey, defaults.g_mdsft_combkey, DPSetCombineKey) saveModeSetting(fMaterial, settings.g_mdsft_textconv, defaults.g_mdsft_textconv, DPSetTextureConvert) saveModeSetting(fMaterial, settings.g_mdsft_text_filt, defaults.g_mdsft_text_filt, DPSetTextureFilter) saveModeSetting(fMaterial, tlut, "G_TT_NONE", DPSetTextureLUT) @@ -1470,66 +1466,39 @@ def saveOtherModeHDefinitionIndividual(fMaterial, settings, tlut, defaults, isHW saveModeSetting(fMaterial, settings.g_mdsft_textdetail, defaults.g_mdsft_textdetail, DPSetTextureDetail) saveModeSetting(fMaterial, settings.g_mdsft_textpersp, defaults.g_mdsft_textpersp, DPSetTexturePersp) saveModeSetting(fMaterial, settings.g_mdsft_cycletype, defaults.g_mdsft_cycletype, DPSetCycleType) - if isHWv1: - saveModeSetting(fMaterial, settings.g_mdsft_color_dither, defaults.g_mdsft_color_dither, DPSetColorDither) saveModeSetting(fMaterial, settings.g_mdsft_pipeline, defaults.g_mdsft_pipeline, DPPipelineMode) def saveOtherModeLDefinition(fMaterial, settings, defaults, defaultRenderMode, matWriteMethod, f3d): if matWriteMethod == GfxMatWriteMethod.WriteAll: - saveOtherModeLDefinitionAll(fMaterial, settings, defaults, defaultRenderMode, f3d) + saveOtherModeLDefinitionAll(fMaterial, settings, defaults, f3d) elif matWriteMethod == GfxMatWriteMethod.WriteDifferingAndRevert: saveOtherModeLDefinitionIndividual(fMaterial, settings, defaults, defaultRenderMode) else: raise PluginError("Unhandled material write method: " + str(matWriteMethod)) -def saveOtherModeLDefinitionAll(fMaterial: FMaterial, settings, defaults, defaultRenderMode, f3d): - is_f3d_old = all((not f3d.F3DEX_GBI, not f3d.F3DEX_GBI_2, not f3d.F3DLP_GBI)) - if not settings.set_rendermode: - cmd = SPSetOtherMode("G_SETOTHERMODE_L", 0, 3 - is_f3d_old, []) - cmd.flagList.append(settings.g_mdsft_alpha_compare) - cmd.flagList.append(settings.g_mdsft_zsrcsel) +def saveOtherModeLDefinitionAll(fMaterial: FMaterial, settings, defaults, f3d): + baseLength = 3 if not settings.set_rendermode else 32 + cmd = SPSetOtherMode("G_SETOTHERMODE_L", 0, baseLength - f3d.F3D_OLD_GBI, []) + cmd.flagList.append(settings.g_mdsft_alpha_compare) + cmd.flagList.append(settings.g_mdsft_zsrcsel) - else: - cmd = SPSetOtherMode("G_SETOTHERMODE_L", 0, 32 - is_f3d_old, []) - cmd.flagList.append(settings.g_mdsft_alpha_compare) - cmd.flagList.append(settings.g_mdsft_zsrcsel) - - if settings.set_rendermode: - flagList, blendList = getRenderModeFlagList(settings, fMaterial) - cmd.flagList.extend(flagList) - if blendList is not None: - cmd.flagList.extend( - [ - "GBL_c1(" - + blendList[0] - + ", " - + blendList[1] - + ", " - + blendList[2] - + ", " - + blendList[3] - + ")", - "GBL_c2(" - + blendList[4] - + ", " - + blendList[5] - + ", " - + blendList[6] - + ", " - + blendList[7] - + ")", - ] - ) - else: - cmd.flagList.extend(defaultRenderMode) + if settings.set_rendermode: + flagList, blendList = getRenderModeFlagList(settings, fMaterial) + cmd.flagList.extend(flagList) + if blendList is not None: + cmd.flagList.extend( + [ + "GBL_c1(" + blendList[0] + ", " + blendList[1] + ", " + blendList[2] + ", " + blendList[3] + ")", + "GBL_c2(" + blendList[4] + ", " + blendList[5] + ", " + blendList[6] + ", " + blendList[7] + ")", + ] + ) fMaterial.mat_only_DL.commands.append(cmd) if settings.g_mdsft_zsrcsel == "G_ZS_PRIM": fMaterial.mat_only_DL.commands.append(DPSetPrimDepth(z=settings.prim_depth.z, dz=settings.prim_depth.dz)) - fMaterial.revert.commands.append(DPSetPrimDepth()) def saveOtherModeLDefinitionIndividual(fMaterial, settings, defaults, defaultRenderMode): From a13b3de37dda864cae92e58282fcabae1dbbbdd7 Mon Sep 17 00:00:00 2001 From: Sauraen Date: Sat, 21 Oct 2023 14:42:43 -0700 Subject: [PATCH 33/74] Fixes --- fast64_internal/f3d/f3d_material.py | 18 ++++++++++-------- fast64_internal/f3d/f3d_parser.py | 2 +- fast64_internal/f3d/f3d_writer.py | 1 + 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/fast64_internal/f3d/f3d_material.py b/fast64_internal/f3d/f3d_material.py index 27990d8..e76e6ba 100644 --- a/fast64_internal/f3d/f3d_material.py +++ b/fast64_internal/f3d/f3d_material.py @@ -36,7 +36,7 @@ from ..utility import * from ..render_settings import Fast64RenderSettings_Properties, update_scene_props_from_render_settings from .f3d_material_helpers import F3DMaterial_UpdateLock from bpy.app.handlers import persistent -from typing import Generator, Optional, Tuple, Any, Dict +from typing import Generator, Optional, Tuple, Any, Dict, Union F3DMaterialHash = Any # giant tuple @@ -177,7 +177,7 @@ def update_draw_layer(self, context): set_output_node_groups(material) -def all_blender_uses(rdp_settings: "RDPSettings") -> Dict[str:bool]: +def all_blender_uses(rdp_settings: "RDPSettings") -> Dict[str, bool]: """ Returns a dictionary of the external features which the blender may or may not use, or None if set_rendermode is disabled so we don't know. @@ -438,7 +438,7 @@ def ui_geo_mode(settings, dataHolder, layout, useDropdown): ) if not useDropdown or dataHolder.menu_geo: - def indentGroup(parent: UILayout, textOrProp: Union[str, F3DMaterialProperty], isText: bool) -> UILayout: + def indentGroup(parent: UILayout, textOrProp: Union[str, "F3DMaterialProperty"], isText: bool) -> UILayout: c = parent.column(align=True) if isText: c.label(text=textOrProp) @@ -879,7 +879,7 @@ class F3DPanel(Panel): elif context.scene.gameEditorMode == "OOT": prop_split(layout, material.f3d_mat.draw_layer, "oot", "Draw Layer") - def ui_misc(self, f3dMat: F3DMaterialProperty, inputCol: UILayout, showCheckBox: bool) -> None: + def ui_misc(self, f3dMat: "F3DMaterialProperty", inputCol: UILayout, showCheckBox: bool) -> None: if f3dMat.rdp_settings.g_ambocclusion: if showCheckBox or f3dMat.set_ao: inputGroup = inputCol.column() @@ -927,7 +927,7 @@ class F3DPanel(Panel): prop_split(inputGroup.row(), f3dMat, "fog_color", "Fog Color") prop_split(inputGroup.row(), f3dMat, "fog_position", "Fog Range") - def checkDrawLayersWarnings(self, f3dMat: F3DMaterialProperty, useDict: Dict[str:bool], layout: UILayout): + def checkDrawLayersWarnings(self, f3dMat: "F3DMaterialProperty", useDict: Dict[str, bool], layout: UILayout): settings = f3dMat.rdp_settings isF3DEX3 = bpy.context.scene.f3d_type == "F3DEX3" lightFxPrereq = isF3DEX3 and settings.g_lighting @@ -948,11 +948,13 @@ class F3DPanel(Panel): return noticeBox = layout.box().column() if not usesVertexColor: - noticeBox.label(text='There must be a vertex color layer called "Alpha".', icon="IMAGE_ALPHA") + noticeBox.label(text='Mesh must have Color Attribute (vtx color) layer called "Alpha".', icon="IMAGE_ALPHA") elif not usesVertexAlpha: - noticeBox.label(text='There must be a vertex color layer called "Col".', icon="IMAGE_RGB_ALPHA") + noticeBox.label( + text='Mesh must have Color Attribute (vtx color) layer called "Col".', icon="IMAGE_RGB_ALPHA" + ) else: - noticeBox.label(text="There must be two vertex color layers.", icon="IMAGE_RGB_ALPHA") + noticeBox.label(text="Mesh must have two Color Attribute (vtx color) layers.", icon="IMAGE_RGB_ALPHA") noticeBox.label(text='They must be called "Col" and "Alpha".', icon="IMAGE_ALPHA") def checkDrawMixedCIWarning(self, layout, useDict, f3dMat): diff --git a/fast64_internal/f3d/f3d_parser.py b/fast64_internal/f3d/f3d_parser.py index d667dcd..ea8ac8b 100644 --- a/fast64_internal/f3d/f3d_parser.py +++ b/fast64_internal/f3d/f3d_parser.py @@ -506,7 +506,7 @@ class F3DContext: # data for Mesh.from_pydata, list of BufferVertex tuples # use BufferVertex to also form uvs / normals / colors self.verts: list[F3DVert] = [] - self.limbGroups: dict[str : list[int]] = {} # dict of groupName : vertex indices + self.limbGroups: dict[str, list[int]] = {} # dict of groupName : vertex indices self.lights: Lights = Lights("lights_context", self.f3d) diff --git a/fast64_internal/f3d/f3d_writer.py b/fast64_internal/f3d/f3d_writer.py index cb50f01..00ad17f 100644 --- a/fast64_internal/f3d/f3d_writer.py +++ b/fast64_internal/f3d/f3d_writer.py @@ -12,6 +12,7 @@ from .f3d_material import ( all_combiner_uses, getMaterialScrollDimensions, isTexturePointSampled, + RDPSettings, ) from .f3d_texture_writer import MultitexManager, TileLoad, maybeSaveSingleLargeTextureSetup from .f3d_gbi import * From e1124e6aaa0575ce51df10020a88ad92cbd324b0 Mon Sep 17 00:00:00 2001 From: Sauraen Date: Sun, 22 Oct 2023 12:36:17 -0700 Subject: [PATCH 34/74] Continued porting of cel shading --- fast64_internal/f3d/f3d_enums.py | 16 +-- fast64_internal/f3d/f3d_gbi.py | 11 ++ fast64_internal/f3d/f3d_material.py | 177 +++++++++++++++++++++++++++- 3 files changed, 194 insertions(+), 10 deletions(-) diff --git a/fast64_internal/f3d/f3d_enums.py b/fast64_internal/f3d/f3d_enums.py index 042367f..759048d 100644 --- a/fast64_internal/f3d/f3d_enums.py +++ b/fast64_internal/f3d/f3d_enums.py @@ -391,18 +391,18 @@ enumLargeEdges = [ ("Wrap", "Wrap", "Wrap outside image bounds (more expensive)"), ] -enumCelThreshMode = { - ("Lighter", "Lighter", "This cel level is drawn when the lighting level per-pixel is LIGHTER than the threshold"), - ("Darker", "Darker", "This cel level is drawn when the lighting level per-pixel is DARKER than the threshold"), -} +enumCelThreshMode = [ + ("Lighter", "Lighter", "This cel level is drawn when the lighting level per-pixel is LIGHTER than (>=) the threshold"), + ("Darker", "Darker", "This cel level is drawn when the lighting level per-pixel is DARKER than (<) the threshold"), +] -enumCelTintPipeline = { +enumCelTintPipeline = [ ("CC", "CC (tint in Prim Color)", "Cel shading puts tint color in Prim Color and tint level in Prim Alpha. Set up CC color to LERP between source color and tint color based on tint level, or multiply source color by tint color. Source may be Tex 0 or Env Color"), ("Blender", "Blender (tint in Fog Color)", "Cel shading puts tint color in Fog Color and tint level in Fog Alpha. Set up blender to LERP between CC output and tint color based on tint level. Then set CC to Tex 0 * shade color (vertex colors)"), -} +] -enumCelTintType = { +enumCelTintType = [ ("Fixed", "Fixed", "Fixed tint color and level stored directly in DL"), ("Segment", "Segment", "Call a segmented DL to set the tint, can change at runtime"), ("Light", "From Light", "Automatically load tint color from selectable light slot. Tint level stored in DL"), -} +] diff --git a/fast64_internal/f3d/f3d_gbi.py b/fast64_internal/f3d/f3d_gbi.py index 4e70e54..100b965 100644 --- a/fast64_internal/f3d/f3d_gbi.py +++ b/fast64_internal/f3d/f3d_gbi.py @@ -2911,6 +2911,13 @@ class FTriGroup: self.fMaterial = fMaterial self.vertexList = VtxList(name + "_vtx_" + str(index)) self.triList = GfxList(name + "_tri_" + str(index), GfxListTag.Geometry, DLFormat.Static) + self.celTriLists = [] + self.celTriListBaseName = f"{name}_tri_{index}_cel" + + def add_cel_tri_list(self): + ret = GfxList(f"{self.celTriListBaseName}{len(self.celTriLists)}", GfxListTag.Geometry, DLFormat.Static) + self.celTriLists.append(ret) + return ret def get_ptr_addresses(self, f3d): return self.triList.get_ptr_addresses(f3d) @@ -2921,12 +2928,16 @@ class FTriGroup: return startAddress, addrRange[1] def save_binary(self, romfile, f3d, segments): + for celTriList in self.celTriLists: + celTriList.save_binary(romfile, f3d, segments); self.triList.save_binary(romfile, f3d, segments) self.vertexList.save_binary(romfile) def to_c(self, f3d, gfxFormatter): data = CData() data.append(self.vertexList.to_c()) + for celTriList in self.celTriLists: + data.append(celTriList.to_c(f3d)) if self.triList: data.append(self.triList.to_c(f3d)) return data diff --git a/fast64_internal/f3d/f3d_material.py b/fast64_internal/f3d/f3d_material.py index e76e6ba..0cf847f 100644 --- a/fast64_internal/f3d/f3d_material.py +++ b/fast64_internal/f3d/f3d_material.py @@ -927,6 +927,69 @@ class F3DPanel(Panel): prop_split(inputGroup.row(), f3dMat, "fog_color", "Fog Color") prop_split(inputGroup.row(), f3dMat, "fog_position", "Fog Range") + def ui_cel_shading(self, material: Material, layout: UILayout): + inputGroup = layout.box().column() + r = inputGroup.row().split(factor=0.3) + r.prop(material.f3d_mat, "do_cel_shading") + if not material.f3d_mat.do_cel_shading: + return + cel = material.f3d_mat.cel_shading + r = r.split(factor=0.28) + r.label(text="Tint pipeline:") + r.prop(cel, "tintPipeline", text="") + + showSegHelp = False + for l in cel.levels: + box = inputGroup.box().column() + r = box.row().split(factor=0.2) + r.label(text="Draw when") + r = r.split(factor=0.3) + r.prop(l, "threshMode", text="") + r = r.split(factor=0.2) + r.label(text="than") + r.prop(l, "threshold") + r = box.row().split(factor=0.08) + r.label(text="Tint:") + r = r.split(factor=0.27) + r.prop(l, "tintType", text="") + if l.tintType == "Fixed": + r = r.split(factor=0.45) + r.prop(l, "tintFixedLevel") + r = r.split(factor=0.3) + r.label(text="Color:") + r.prop(l, "tintFixedColor", text="") + elif l.tintType == "Segment": + r = r.split(factor=0.45) + r.prop(l, "tintSegmentNum") + r.prop(l, "tintSegmentOffset") + showSegHelp = True + elif l.tintType == "Light": + r = r.split(factor=0.45) + r.prop(l, "tintFixedLevel") + r = r.split(factor=0.7) + r.label(text="Light (/end):") + r.prop(l, "tintLightSlot", text="") + else: + raise PluginError("Invalid tintType") + if showSegHelp: + tintName, tintNameCap = ("prim", "Prim") if cel.tintPipeline == "CC" else ("fog", "Fog") + r = inputGroup.row() + r.label(icon="INFO", text="Segments: In your code, set up DL in segment(s) used with") + r.scale_y = 0.75 + r = inputGroup.row() + r.label(text=f"gsDPSet{tintNameCap}Color then gsSPEndDisplayList at appropriate offset") + r.scale_y = 0.75 + r = inputGroup.row() + r.label(text=f"with {tintName} color = tint color and {tintName} alpha = tint level.") + r.scale_y = 0.75 + + r = inputGroup.row() + op = r.operator(CelLevelAdd.bl_idname) + op.materialName = material.name + if len(cel.levels) > 0: + op = r.operator(CelLevelRemove.bl_idname) + op.materialName = material.name + def checkDrawLayersWarnings(self, f3dMat: "F3DMaterialProperty", useDict: Dict[str, bool], layout: UILayout): settings = f3dMat.rdp_settings isF3DEX3 = bpy.context.scene.f3d_type == "F3DEX3" @@ -1149,6 +1212,9 @@ class F3DPanel(Panel): else: presetCol.prop(context.scene, "f3dUserPresetsOnly") self.draw_full(f3dMat, material, layout, context) + + if context.scene.f3d_type == "F3DEX3": + self.ui_cel_shading(material, layout) def ui_tileScroll(tex, name, layout): @@ -3116,6 +3182,91 @@ class DefaultRDPSettingsPanel(Panel): ui_other(world.rdp_defaults, world, layout, True) +class CelLevelProperty(PropertyGroup): + threshMode : bpy.props.EnumProperty(items = enumCelThreshMode, name = "Draw when", default = "Lighter") + threshold : bpy.props.IntProperty( + name = "Threshold", + description = "Light level at which the boundary between cel levels occurs. One level is >= this value, the other is < it", + min = 2, + max = 255, + default = 128 + ) + tintType : bpy.props.EnumProperty(items = enumCelTintType, name = "Tint type", default = "Fixed") + tintFixedLevel : bpy.props.IntProperty( + name = "Level", + description = "0: original color <=> 255: fully tint color", + min = 0, + max = 255, + default = 50, + ) + tintFixedColor : bpy.props.FloatVectorProperty( + name = "Tint color", + size = 3, + min = 0.0, + max = 1.0, + subtype = "COLOR", + ) + tintSegmentNum : bpy.props.IntProperty( + name = "Segment", + description = "Segment number to store tint DL in", + min = 8, + max = 0xD, + default = 8, + ) + tintSegmentOffset : bpy.props.IntProperty( + name = "Offset (instr)", + description = "Number of instructions (8 bytes) within this DL to jump to", + min = 0, + max = 1000, + default = 0, + ) + tintLightSlot : bpy.props.IntProperty( + name = "Light slot (from end)", + description = "Which light to load RGB color from, counting from the end. 0 = ambient, 1 = last directional / point light, 2 = second-to-last, etc.", + min = 0, + max = 9, + default = 1, + ) + + +class CelShadingProperty(PropertyGroup): + tintPipeline : bpy.props.EnumProperty(items = enumCelTintPipeline, name = "Tint pipeline", default = "CC") + levels : bpy.props.CollectionProperty(type = CelLevelProperty, name = "Cel levels") + + +def celGetMaterialLevels(materialName): + material = bpy.data.materials.get(materialName) + if material is None: + raise PluginError(f"Could not find material {materialName}") + return material.f3d_mat.cel_shading.levels + + +class CelLevelAdd(bpy.types.Operator): + bl_idname = "material.f3d_cel_level_add" + bl_label = "Add Cel Level" + bl_options = {'REGISTER', 'UNDO'} + + materialName : bpy.props.StringProperty() + + def execute(self, context): + levels = celGetMaterialLevels(self.materialName) + levels.add() + return {'FINISHED'} + + +class CelLevelRemove(bpy.types.Operator): + bl_idname = "material.f3d_cel_level_remove" + bl_label = "Remove Last Level" + bl_options = {'REGISTER', 'UNDO'} + + materialName : bpy.props.StringProperty() + + def execute(self, context): + levels = celGetMaterialLevels(self.materialName) + levels.remove(len(levels) - 1) + return {'FINISHED'} + + def getOptimalFormat(tex, curFormat, isMultitexture): texFormat = "RGBA16" if isMultitexture: @@ -3191,8 +3342,11 @@ class MATERIAL_MT_f3d_presets(Menu): props_default = getattr(self, "preset_operator_defaults", None) add_operator = getattr(self, "preset_add_operator", None) presetDir = getCurrentPresetDir() - paths = bpy.utils.preset_paths(presetDir) if not bpy.context.scene.f3dUserPresetsOnly else [] - paths += bpy.utils.preset_paths("f3d/user") + paths = bpy.utils.preset_paths("f3d/user") + if not bpy.context.scene.f3dUserPresetsOnly: + paths += bpy.utils.preset_paths(presetDir) + if bpy.context.scene.f3d_type == "F3DEX3": + paths += bpy.utils.preset_paths(f"{presetDir}_cel") self.path_menu( paths, self.preset_operator, @@ -3837,6 +3991,9 @@ class F3DMaterialProperty(PropertyGroup): use_large_textures: bpy.props.BoolProperty(name="Large Texture Mode") large_edges: bpy.props.EnumProperty(items=enumLargeEdges, default="Clamp") + do_cel_shading : bpy.props.BoolProperty(name = "Cel Shading") + cel_shading : bpy.props.PointerProperty(type = CelShadingProperty) + def key(self) -> F3DMaterialHash: useDefaultLighting = self.set_lights and self.use_default_lighting return ( @@ -3850,6 +4007,18 @@ class F3DMaterialProperty(PropertyGroup): self.rdp_settings.key(), self.draw_layer.key(), self.use_large_textures, + self.do_cel_shading, + self.cel_shading.tintPipeline if self.do_cel_shading else None, + tuple([( + c.threshMode, + c.threshold, + c.tintType, + c.tintFixedLevel, + c.tintFixedColor, + c.tintSegmentNum, + c.tintSegmentOffset, + c.tintLightSlot + ) for c in self.cel_shading.levels]) if self.do_cel_shading else None, self.use_default_lighting, self.set_blend, self.set_prim, @@ -4050,6 +4219,10 @@ mat_classes = ( PrimDepthSettings, RDPSettings, DefaultRDPSettingsPanel, + CelLevelProperty, + CelShadingProperty, + CelLevelAdd, + CelLevelRemove, F3DMaterialProperty, ReloadDefaultF3DPresets, UpdateF3DNodes, From 520e797325bb300466c00c86fd6f2b609d62b0c7 Mon Sep 17 00:00:00 2001 From: Sauraen Date: Mon, 23 Oct 2023 22:04:15 -0700 Subject: [PATCH 35/74] Porting tri writing --- fast64_internal/f3d/f3d_enums.py | 6 + fast64_internal/f3d/f3d_material.py | 166 ++++++++++-------- fast64_internal/f3d/f3d_writer.py | 129 ++++++++++++-- fast64_internal/sm64/sm64_geolayout_writer.py | 26 --- fast64_internal/utility.py | 11 +- 5 files changed, 226 insertions(+), 112 deletions(-) diff --git a/fast64_internal/f3d/f3d_enums.py b/fast64_internal/f3d/f3d_enums.py index 759048d..be36afd 100644 --- a/fast64_internal/f3d/f3d_enums.py +++ b/fast64_internal/f3d/f3d_enums.py @@ -401,6 +401,12 @@ enumCelTintPipeline = [ ("Blender", "Blender (tint in Fog Color)", "Cel shading puts tint color in Fog Color and tint level in Fog Alpha. Set up blender to LERP between CC output and tint color based on tint level. Then set CC to Tex 0 * shade color (vertex colors)"), ] +enumCelCutoutSource = [ + ("TEXEL0", "Texture 0", "Cel shading material has binary alpha cutout from Texture 0 alpha. Does not work with I4 or I8 formats"), + ("TEXEL1", "Texture 1", "Cel shading material has binary alpha cutout from Texture 1 alpha. Does not work with I4 or I8 formats"), + ("ENVIRONMENT", "None / Env Alpha", "Make sure your material writes env color, and set env alpha to opaque (255)"), +] + enumCelTintType = [ ("Fixed", "Fixed", "Fixed tint color and level stored directly in DL"), ("Segment", "Segment", "Call a segmented DL to set the tint, can change at runtime"), diff --git a/fast64_internal/f3d/f3d_material.py b/fast64_internal/f3d/f3d_material.py index 0cf847f..c90ab9b 100644 --- a/fast64_internal/f3d/f3d_material.py +++ b/fast64_internal/f3d/f3d_material.py @@ -311,7 +311,8 @@ def F3DOrganizeLights(self, context): self.f3d_light7 = lightList[6] if len(lightList) > 6 else None -def combiner_uses(material, checkList, is2Cycle): +def combiner_uses(material, checkList): + is2Cycle = f3d_mat.rdp_settings.g_mdsft_cycletype == "G_CYC_2CYCLE" display = False for value in checkList: if value[:5] == "TEXEL": @@ -389,11 +390,11 @@ CombinerUses = dict[str, bool] def combiner_uses_tex0(f3d_mat: "F3DMaterialProperty"): - return combiner_uses(f3d_mat, ["TEXEL0", "TEXEL0_ALPHA"], f3d_mat.rdp_settings.g_mdsft_cycletype == "G_CYC_2CYCLE") + return combiner_uses(f3d_mat, ["TEXEL0", "TEXEL0_ALPHA"]) def combiner_uses_tex1(f3d_mat: "F3DMaterialProperty"): - return combiner_uses(f3d_mat, ["TEXEL1", "TEXEL1_ALPHA"], f3d_mat.rdp_settings.g_mdsft_cycletype == "G_CYC_2CYCLE") + return combiner_uses(f3d_mat, ["TEXEL1", "TEXEL1_ALPHA"]) def all_combiner_uses(f3d_mat: "F3DMaterialProperty") -> CombinerUses: @@ -407,22 +408,21 @@ def all_combiner_uses(f3d_mat: "F3DMaterialProperty") -> CombinerUses: "Primitive": combiner_uses( f3d_mat, ["PRIMITIVE", "PRIMITIVE_ALPHA", "PRIM_LOD_FRAC"], - f3d_mat.rdp_settings.g_mdsft_cycletype == "G_CYC_2CYCLE", ), "Environment": combiner_uses( - f3d_mat, ["ENVIRONMENT", "ENV_ALPHA"], f3d_mat.rdp_settings.g_mdsft_cycletype == "G_CYC_2CYCLE" + f3d_mat, ["ENVIRONMENT", "ENV_ALPHA"] ), "Shade": combiner_uses( - f3d_mat, ["SHADE", "SHADE_ALPHA"], f3d_mat.rdp_settings.g_mdsft_cycletype == "G_CYC_2CYCLE" + f3d_mat, ["SHADE", "SHADE_ALPHA"] ), "Shade Alpha": combiner_uses_alpha( - f3d_mat, ["SHADE"], f3d_mat.rdp_settings.g_mdsft_cycletype == "G_CYC_2CYCLE" + f3d_mat, ["SHADE"] ), - "Key": combiner_uses(f3d_mat, ["CENTER", "SCALE"], f3d_mat.rdp_settings.g_mdsft_cycletype == "G_CYC_2CYCLE"), + "Key": combiner_uses(f3d_mat, ["CENTER", "SCALE"]), "LOD Fraction": combiner_uses( - f3d_mat, ["LOD_FRACTION"], f3d_mat.rdp_settings.g_mdsft_cycletype == "G_CYC_2CYCLE" + f3d_mat, ["LOD_FRACTION"] ), - "Convert": combiner_uses(f3d_mat, ["K4", "K5"], f3d_mat.rdp_settings.g_mdsft_cycletype == "G_CYC_2CYCLE"), + "Convert": combiner_uses(f3d_mat, ["K4", "K5"]), } return useDict @@ -591,8 +591,6 @@ def ui_lower_mode(settings, dataHolder, layout: UILayout, useDropdown): ) if not useDropdown or dataHolder.menu_lower: prop_split(inputGroup, settings, "g_mdsft_alpha_compare", "Alpha Compare") - if settings.g_mdsft_alpha_compare == "G_AC_THRESHOLD" and settings.g_mdsft_cycletype == "G_CYC_2CYCLE": - inputGroup.label(text="Compares blend alpha to *first cycle* combined (CC) alpha.") prop_split(inputGroup, settings, "g_mdsft_zsrcsel", "Z Source Selection") if settings.g_mdsft_zsrcsel == "G_ZS_PRIM": prim_box = inputGroup.box() @@ -929,59 +927,78 @@ class F3DPanel(Panel): def ui_cel_shading(self, material: Material, layout: UILayout): inputGroup = layout.box().column() - r = inputGroup.row().split(factor=0.3) - r.prop(material.f3d_mat, "do_cel_shading") - if not material.f3d_mat.do_cel_shading: + r = inputGroup.row() + r.prop(material.f3d_mat, "use_cel_shading") + if not material.f3d_mat.use_cel_shading: return cel = material.f3d_mat.cel_shading - r = r.split(factor=0.28) + r = inputGroup.row().split(factor=0.3) r.label(text="Tint pipeline:") + r = r.split(factor=0.3) r.prop(cel, "tintPipeline", text="") + r = r.split(factor=0.3) + r.label(text="Cutout:") + r.prop(cel, "cutoutSource", text="") + + if cel.cutoutSource == "ENVIRONMENT": + if not material.f3d_mat.set_env or material.f3d_mat.env_color[3] != 1.0: + inputGroup.label(text = "Enable env color, and set env alpha to 255.", icon = "ERROR") + else: + if not combiner_uses(material, cel.cutoutSource): + inputGroup.label(text = "This texture does not exist.", icon = "ERROR") + + if ( + len(cel.levels) >= 3 and + cel.levels[0].threshMode == cel.levels[1].threshMode and + not all([cel.levels[0].threshMode == lvl.threshMode for lvl in cel.levels[1:]]) + ): + multilineLabel(inputGroup.box(), + "If using both lighter and darker cel\n" + + "levels, one of each must be at the beginning", + "ERROR" + ) showSegHelp = False - for l in cel.levels: + for level in cel.levels: box = inputGroup.box().column() r = box.row().split(factor=0.2) r.label(text="Draw when") r = r.split(factor=0.3) - r.prop(l, "threshMode", text="") + r.prop(level, "threshMode", text="") r = r.split(factor=0.2) r.label(text="than") - r.prop(l, "threshold") + r.prop(level, "threshold") r = box.row().split(factor=0.08) r.label(text="Tint:") r = r.split(factor=0.27) - r.prop(l, "tintType", text="") - if l.tintType == "Fixed": + r.prop(level, "tintType", text="") + if level.tintType == "Fixed": r = r.split(factor=0.45) - r.prop(l, "tintFixedLevel") + r.prop(level, "tintFixedLevel") r = r.split(factor=0.3) r.label(text="Color:") - r.prop(l, "tintFixedColor", text="") - elif l.tintType == "Segment": + r.prop(level, "tintFixedColor", text="") + elif level.tintType == "Segment": r = r.split(factor=0.45) - r.prop(l, "tintSegmentNum") - r.prop(l, "tintSegmentOffset") + r.prop(level, "tintSegmentNum") + r.prop(level, "tintSegmentOffset") showSegHelp = True - elif l.tintType == "Light": + elif level.tintType == "Light": r = r.split(factor=0.45) - r.prop(l, "tintFixedLevel") - r = r.split(factor=0.7) + r.prop(level, "tintFixedLevel") + r = r.split(factor=0.65) r.label(text="Light (/end):") - r.prop(l, "tintLightSlot", text="") + r.prop(level, "tintLightSlot", text="") else: raise PluginError("Invalid tintType") if showSegHelp: tintName, tintNameCap = ("prim", "Prim") if cel.tintPipeline == "CC" else ("fog", "Fog") - r = inputGroup.row() - r.label(icon="INFO", text="Segments: In your code, set up DL in segment(s) used with") - r.scale_y = 0.75 - r = inputGroup.row() - r.label(text=f"gsDPSet{tintNameCap}Color then gsSPEndDisplayList at appropriate offset") - r.scale_y = 0.75 - r = inputGroup.row() - r.label(text=f"with {tintName} color = tint color and {tintName} alpha = tint level.") - r.scale_y = 0.75 + multilineLabel(inputGroup, + "Segments: In your code, set up DL in segment(s) used with\n" + + f"gsDPSet{tintNameCap}Color then gsSPEndDisplayList at appropriate offset\n" + + f"with {tintName} color = tint color and {tintName} alpha = tint level.", + 'INFO' + ) r = inputGroup.row() op = r.operator(CelLevelAdd.bl_idname) @@ -1085,43 +1102,38 @@ class F3DPanel(Panel): self.checkDrawLayersWarnings(f3dMat, useDict, layout) + def drawCCProps(ui: UILayout, combiner: "CombinerProperty", isAlpha: bool) -> None: + ui = ui.column() + for letter in ["A", "B", "C", "D"]: + r = ui.row().split(factor=0.25 if isAlpha else 0.1) + r.label(text = f"{letter}{' Alpha' if isAlpha else ''}:") + r.prop(combiner, f"{letter}{'_alpha' if isAlpha else ''}", text="") + + isTwoCycle = f3dMat.rdp_settings.g_mdsft_cycletype == "G_CYC_2CYCLE" + combinerBox = layout.box() combinerBox.prop(f3dMat, "set_combiner", text="Color Combiner (Color = (A - B) * C + D)") - combinerCol = combinerBox.row() + combinerCol = combinerBox.row().split(factor=0.45) combinerCol.enabled = f3dMat.set_combiner - rowColor = combinerCol.column() - rowAlpha = combinerCol.column() + drawCCProps(combinerCol, f3dMat.combiner1, False) + + if f3dMat.use_cel_shading: + r = combinerCol.column().box().column() + r.label(text = "") + r.label(text = f"CC alpha{' cycle 1' if isTwoCycle else ''} is") + r.label(text = "occupied by cel shading.") + r.label(text = "") + r.scale_y = 0.9 + else: + drawCCProps(combinerCol, f3dMat.combiner1, True) - rowColor.prop(f3dMat.combiner1, "A") - rowColor.prop(f3dMat.combiner1, "B") - rowColor.prop(f3dMat.combiner1, "C") - rowColor.prop(f3dMat.combiner1, "D") - rowAlpha.prop(f3dMat.combiner1, "A_alpha") - rowAlpha.prop(f3dMat.combiner1, "B_alpha") - rowAlpha.prop(f3dMat.combiner1, "C_alpha") - rowAlpha.prop(f3dMat.combiner1, "D_alpha") - if ( - f3dMat.rdp_settings.g_mdsft_alpha_compare == "G_AC_THRESHOLD" - and f3dMat.rdp_settings.g_mdsft_cycletype == "G_CYC_2CYCLE" - ): - combinerBox.label(text="First cycle alpha out used for compare threshold.") - - if f3dMat.rdp_settings.g_mdsft_cycletype == "G_CYC_2CYCLE": + if isTwoCycle: combinerBox2 = layout.box() combinerBox2.label(text="Color Combiner Cycle 2") combinerBox2.enabled = f3dMat.set_combiner - combinerCol2 = combinerBox2.row() - rowColor2 = combinerCol2.column() - rowAlpha2 = combinerCol2.column() - - rowColor2.prop(f3dMat.combiner2, "A") - rowColor2.prop(f3dMat.combiner2, "B") - rowColor2.prop(f3dMat.combiner2, "C") - rowColor2.prop(f3dMat.combiner2, "D") - rowAlpha2.prop(f3dMat.combiner2, "A_alpha") - rowAlpha2.prop(f3dMat.combiner2, "B_alpha") - rowAlpha2.prop(f3dMat.combiner2, "C_alpha") - rowAlpha2.prop(f3dMat.combiner2, "D_alpha") + combinerCol2 = combinerBox2.row().split(factor=0.45) + drawCCProps(combinerCol2, f3dMat.combiner2, False) + drawCCProps(combinerCol2, f3dMat.combiner2, True) if useDict["Texture 0"]: cc_list = ["A", "B", "C", "D", "A_alpha", "B_alpha", "C_alpha", "D_alpha"] @@ -1194,6 +1206,7 @@ class F3DPanel(Panel): return f3dMat = material.f3d_mat + settings = f3dMat.rdp_settings layout.prop(context.scene, "f3d_simple", text="Show Simplified UI") layout = layout.box() titleCol = layout.column() @@ -1207,6 +1220,12 @@ class F3DPanel(Panel): row.operator(AddPresetF3D.bl_idname, text="", icon="ZOOM_IN") row.operator(AddPresetF3D.bl_idname, text="", icon="ZOOM_OUT").remove_active = True + if settings.g_mdsft_alpha_compare == "G_AC_THRESHOLD" and settings.g_mdsft_cycletype == "G_CYC_2CYCLE": + multilineLabel(layout.box(), + "RDP silicon bug: Alpha compare in 2-cycle mode is broken.\n" + + "Compares to FIRST cycle CC alpha output from NEXT pixel.", + 'ORPHAN_DATA') + if context.scene.f3d_simple and f3dMat.presetName != "Custom": self.draw_simple(f3dMat, material, layout, context) else: @@ -3231,6 +3250,7 @@ class CelLevelProperty(PropertyGroup): class CelShadingProperty(PropertyGroup): tintPipeline : bpy.props.EnumProperty(items = enumCelTintPipeline, name = "Tint pipeline", default = "CC") + cutoutSource : bpy.props.EnumProperty(items = enumCelCutoutSource, name = "Cutout", default = "ENVIRONMENT") levels : bpy.props.CollectionProperty(type = CelLevelProperty, name = "Cel levels") @@ -3991,7 +4011,7 @@ class F3DMaterialProperty(PropertyGroup): use_large_textures: bpy.props.BoolProperty(name="Large Texture Mode") large_edges: bpy.props.EnumProperty(items=enumLargeEdges, default="Clamp") - do_cel_shading : bpy.props.BoolProperty(name = "Cel Shading") + use_cel_shading : bpy.props.BoolProperty(name = "Cel Shading") cel_shading : bpy.props.PointerProperty(type = CelShadingProperty) def key(self) -> F3DMaterialHash: @@ -4007,8 +4027,8 @@ class F3DMaterialProperty(PropertyGroup): self.rdp_settings.key(), self.draw_layer.key(), self.use_large_textures, - self.do_cel_shading, - self.cel_shading.tintPipeline if self.do_cel_shading else None, + self.use_cel_shading, + self.cel_shading.tintPipeline if self.use_cel_shading else None, tuple([( c.threshMode, c.threshold, @@ -4018,7 +4038,7 @@ class F3DMaterialProperty(PropertyGroup): c.tintSegmentNum, c.tintSegmentOffset, c.tintLightSlot - ) for c in self.cel_shading.levels]) if self.do_cel_shading else None, + ) for c in self.cel_shading.levels]) if self.use_cel_shading else None, self.use_default_lighting, self.set_blend, self.set_prim, diff --git a/fast64_internal/f3d/f3d_writer.py b/fast64_internal/f3d/f3d_writer.py index 00ad17f..8a533c9 100644 --- a/fast64_internal/f3d/f3d_writer.py +++ b/fast64_internal/f3d/f3d_writer.py @@ -304,8 +304,7 @@ def saveMeshWithLargeTexturesByFaces( texDimensions, material, currentGroupIndex, - triGroup.triList, - triGroup.vertexList, + triGroup, copy.deepcopy(existingVertData), copy.deepcopy(matRegionDict), ) @@ -630,8 +629,7 @@ def saveMeshByFaces( texDimensions, material, currentGroupIndex, - triGroup.triList, - triGroup.vertexList, + triGroup, copy.deepcopy(existingVertData), copy.deepcopy(matRegionDict), ) @@ -791,8 +789,7 @@ class TriangleConverter: texDimensions: tuple[int, int], material: bpy.types.Material, currentGroupIndex, - triList, - vtxList, + triGroup: FTriGroup, existingVertexData: list[BufferVertex], existingVertexMaterialRegions, ): @@ -808,9 +805,11 @@ class TriangleConverter: self.bufferStart = len(self.vertBuffer) self.vertexBufferTriangles = [] # [(index0, index1, index2)] - self.triList = triList - self.vtxList = vtxList + self.triGroup = triGroup + self.triList = triGroup.triList + self.vtxList = triGroup.vtxList + self.material = material uv_data = triConverterInfo.obj.data.uv_layers["UVMap"].data self.convertInfo = LoopConvertInfo(uv_data, triConverterInfo.obj, material) self.texDimensions = texDimensions @@ -897,11 +896,117 @@ class TriangleConverter: bufferStart = bufferEnd # Load triangles - self.triList.commands.extend( - createTriangleCommands( - self.vertexBufferTriangles, self.vertBuffer, not self.triConverterInfo.f3d.F3D_OLD_GBI - ) + triCmds = createTriangleCommands( + self.vertexBufferTriangles, self.vertBuffer, not self.triConverterInfo.f3d.F3D_OLD_GBI ) + if not self.material.f3d_mat.use_cel_shading: + self.triList.commands.extend(triCmds) + else: + if len(triCmds) <= 2: + self.writeCelLevels(triCmds = triCmds) + else: + celTriList = self.triGroup.add_cel_tri_list() + celTriList.commands.extend(triCmds) + celTriList.commands.append(SPEndDisplayList()) + self.writeCelLevels(celTriList = celTriList) + + def writeCelLevels(self, celTriList: Optional[GfxList] = None, triCmds: Optional[List[GbiMacro]] = None): + settings = self.material.f3d_mat.rdp_settings + cel = self.material.f3d_mat.cel_shading + f3d = get_F3D_GBI() + + # Don't want to have to change back and forth arbitrarily between decal and + # opaque mode. So if you're using both lighter and darker, need to do those + # first before switching to opaque. + wroteLighter = wroteDarker = usesDecal = False + if len(cel.levels): + raise PluginError(f"Material {self.material.name} with cel shading has no cel levels") + for level in cel.levels: + if level.threshMode == "Darker": + if wroteDarker: + usesDecal = True + elif usesDecal: + raise PluginError("Must use Lighter and Darker cel levels before duplicating either of them") + wroteDarker = True + else: + if wroteLighter: + usesDecal = True + elif usesDecal: + raise PluginError("Must use Lighter and Darker cel levels before duplicating either of them") + wroteLighter = True + + wroteLighter = wroteDarker = wroteOpaque = wroteDecal = False + lastDarker = None + for level in cel.levels: + darker = level.threshMode == "Darker" + self.triList.commands.append(DPPipeSync()) + if usesDecal: + if not wroteOpaque: + wroteOpaque = True + self.triList.commands.append(SPSetOtherMode("G_SETOTHERMODE_L", + 10, 2, ["ZMODE_OPA"])) + elif not wroteDecal and (darker and wroteDarker or not darker and wroteLighter): + wroteDecal = True + self.triList.commands.append(SPSetOtherMode("G_SETOTHERMODE_L", + 10, 2, ["ZMODE_DEC"])) + if darker: + wroteDarker = True + else: + wroteLighter = True + + if lastDarker != darker: + lastDarker = darker + # Set up CC + ccSettings = [] + for prop in ["A", "B", "C", "D"]: + ccSettings.append(getattr(settings.combiner1, prop)) + ccSettings.extend(["1", "SHADE"] if darker else ["SHADE", "0"]) + ccSettings.extend([cel.cutoutSource, "0"]) + if settings.g_mdsft_cycletype == "G_CYC_2CYCLE": + for prop in ["A", "B", "C", "D", "A_alpha", "B_alpha", "C_alpha", "D_alpha"]: + ccSettings.append(getattr(settings.combiner2, prop)) + else: + ccSettings *= 2 + self.triList.commands.append(DPSetCombineMode(*ccSettings)) + + # Set up tint color and level + if level.tintType == "Fixed": + color = exportColor(level.tintFixedColor) + if cel.tintPipeline == "CC": + self.triList.commands.append(DPSetPrimColor(0, 0, color[0], + color[1], color[2], level.tintFixedLevel)) + else: + self.triList.commands.append(DPSetFogColor(color[0], + color[1], color[2], level.tintFixedLevel)) + elif level.tintType == "Segment": + self.triList.commands.append(SPDisplayList(GfxList( + f"{level.tintSegmentNum:#02X}{level.tintSegmentOffset * 8:06X}", + GfxListTag.Material, + DLFormat.Static + ))) + else: + pass # TODO light to RDP + + # Set up threshold + self.triList.commands.append(DPSetBlendColor(255, 255, 255, + 0x101 - level.threshold if darker else level.threshold)) + self.triList.commands.append(SPAlphaCompareCull( + f3d.G_ALPHA_COMPARE_CULL_ABOVE if darker else + f3d.G_ALPHA_COMPARE_CULL_BELOW, + level.threshold)) + + # Draw tris, inline or by call + if triCmds is not None: + self.triList.commands.extend(triCmds) + else: + self.triList.commands.append(SPDisplayList(celTriList)) + + # Disable alpha compare culling for future DLs + self.triList.commands.append(SPAlphaCompareCull( + f3d.G_ALPHA_COMPARE_CULL_DISABLE, 0)) + + + def addFace(self, face, stOffset): triIndices = [] diff --git a/fast64_internal/sm64/sm64_geolayout_writer.py b/fast64_internal/sm64/sm64_geolayout_writer.py index e1d723c..61e0e43 100644 --- a/fast64_internal/sm64/sm64_geolayout_writer.py +++ b/fast64_internal/sm64/sm64_geolayout_writer.py @@ -2763,32 +2763,6 @@ def saveSkinnedMeshByMaterial( ) return fMesh, fSkinnedMesh - # for material_index, skinnedFaceArray in skinnedFaces.items(): - # - # # We've already saved all materials, this just returns the existing ones. - # material = obj.material_slots[material_index].material - # fMaterial, texDimensions = \ - # saveOrGetF3DMaterial(material, fModel, obj, drawLayer, convertTextureData) - # isPointSampled = isTexturePointSampled(material) - # - # triGroup = fMesh.tri_group_new(fMaterial) - # fMesh.draw.commands.append(SPDisplayList(fMaterial.material)) - # fMesh.draw.commands.append(SPDisplayList(triGroup.triList)) - # if fMaterial.revert is not None: - # fMesh.draw.commands.append(SPDisplayList(fMaterial.revert)) - # - # convertInfo = LoopConvertInfo(uv_data, obj, material) - # triConverter = TriangleConverter(triConverterInfo, texDimensions, material, - # None, triGroup.triList, triGroup.vertexList, copy.deepcopy(existingVertData), copy.deepcopy(matRegionDict)) - # saveTriangleStrip(triConverter, [skinnedFace.bFace for skinnedFace in skinnedFaceArray], None, obj.data, True) - # saveTriangleStrip(triConverterClass, - # [skinnedFace.bFace for skinnedFace in skinnedFaceArray], None, - # convertInfo, triGroup.triList, triGroup.vertexList, fModel.f3d, - # texDimensions, currentMatrix, isPointSampled, - # copy.deepcopy(existingVertData), copy.deepcopy(matRegionDict), - # infoDict, obj.data, None, True) - - return fMesh, fSkinnedMesh def writeDynamicMeshFunction(name, displayList): diff --git a/fast64_internal/utility.py b/fast64_internal/utility.py index 6654118..c9b72c8 100644 --- a/fast64_internal/utility.py +++ b/fast64_internal/utility.py @@ -2,7 +2,8 @@ import bpy, random, string, os, math, traceback, re, os, mathutils, ast, operato from math import pi, ceil, degrees, radians, copysign from mathutils import * from .utility_anim import * -from typing import Callable, Iterable, Any, Tuple +from typing import Callable, Iterable, Any, Tuple, Optional +from bpy.types import UILayout CollectionProperty = Any # collection prop as defined by using bpy.props.CollectionProperty @@ -1195,6 +1196,14 @@ def prop_split(layout, data, field, name, **prop_kwargs): split.prop(data, field, text="", **prop_kwargs) +def multilineLabel(layout: UILayout, text: str, icon: str = "NONE"): + layout = layout.column() + for i, line in enumerate(text.split("\n")): + r = layout.row() + r.label(text = line, icon = icon if i == 0 else "NONE") + r.scale_y = 0.75 + + def toAlnum(name, exceptions=[]): if name is None or name == "": return None From f5713b246ff9aa2e913c23b0bc397b5b04e56d73 Mon Sep 17 00:00:00 2001 From: Sauraen Date: Wed, 25 Oct 2023 22:30:15 -0700 Subject: [PATCH 36/74] Fixed cel shading UI --- fast64_internal/f3d/f3d_gbi.py | 6 +- fast64_internal/f3d/f3d_material.py | 220 +++++++++++++--------------- fast64_internal/f3d/f3d_writer.py | 38 ++--- 3 files changed, 128 insertions(+), 136 deletions(-) diff --git a/fast64_internal/f3d/f3d_gbi.py b/fast64_internal/f3d/f3d_gbi.py index 100b965..ae667d4 100644 --- a/fast64_internal/f3d/f3d_gbi.py +++ b/fast64_internal/f3d/f3d_gbi.py @@ -4686,14 +4686,14 @@ class SPLightToPrimColor(GbiMacro): @dataclass(unsafe_hash=True) -class SPLightToEnvColor(GbiMacro): +class SPLightToFogColor(GbiMacro): light: int alpha: int def to_binary(self, f3d, segments): if not f3d.F3DEX_GBI_3: - raise PluginError("SPLightToEnvColor requires F3DEX3 microcode") - word0 = _SHIFTL(f3d.G_SETENVCOLOR, 24, 8) + raise PluginError("SPLightToFogColor requires F3DEX3 microcode") + word0 = _SHIFTL(f3d.G_SETFOGCOLOR, 24, 8) return SPLightToRDP(self.light, self.alpha, word0).to_binary(f3d, segments) diff --git a/fast64_internal/f3d/f3d_material.py b/fast64_internal/f3d/f3d_material.py index c90ab9b..bb26696 100644 --- a/fast64_internal/f3d/f3d_material.py +++ b/fast64_internal/f3d/f3d_material.py @@ -177,6 +177,15 @@ def update_draw_layer(self, context): set_output_node_groups(material) +def rendermodePresetToBits(rdp_settings: "RDPSettings") -> Tuple[int, int]: + f3d = get_F3D_GBI() + r1 = getattr(f3d, rdp_settings.rendermode_preset_cycle_1, f3d.G_RM_AA_ZB_OPA_SURF) + r2 = getattr(f3d, rdp_settings.rendermode_preset_cycle_2, f3d.G_RM_AA_ZB_OPA_SURF) + if rdp_settings.g_mdsft_cycletype == "G_CYC_1CYCLE": + r2 = 0 + return r1, r2 + + def all_blender_uses(rdp_settings: "RDPSettings") -> Dict[str, bool]: """ Returns a dictionary of the external features which the blender may or may @@ -191,11 +200,8 @@ def all_blender_uses(rdp_settings: "RDPSettings") -> Dict[str, bool]: if not is_one_cycle: useShade = useShade or rdp_settings.blend_a2 == "G_BL_A_SHADE" else: + r1, r2 = rendermodePresetToBits(rdp_settings) f3d = get_F3D_GBI() - r1 = getattr(f3d, rdp_settings.rendermode_preset_cycle_1, f3d.G_RM_AA_ZB_OPA_SURF) - r2 = getattr(f3d, rdp_settings.rendermode_preset_cycle_2, f3d.G_RM_AA_ZB_OPA_SURF) - if is_one_cycle: - r2 = 0 useZ = bool((r1 | r2) & (f3d.Z_CMP | f3d.Z_UPD)) useShade = ((r1 >> 26) & 3) == f3d.G_BL_A_SHADE or ((r2 >> 24) & 3) == f3d.G_BL_A_SHADE return {"Shade Alpha": useShade, "Z Buffer": useZ} @@ -258,6 +264,20 @@ def update_blend_method(material: Material, context): material.alpha_threshold = 0.125 +def getZMode(material: Material): + f3dMat = material.f3d_mat + settings = f3dMat.rdp_settings + if not settings.set_rendermode: + return "ZMODE_OPA" + if settings.rendermode_advanced_enabled: + return settings.zmode + r1, r2 = rendermodePresetToBits(settings) + f3d = get_F3D_GBI() + zmode = ((r1 | r2) & f3d.ZMODE_DEC) // f3d.ZMODE_INTER + return enumZMode[zmode][0] + + + class DrawLayerProperty(PropertyGroup): sm64: bpy.props.EnumProperty(items=sm64EnumDrawLayers, default="1", update=update_draw_layer) oot: bpy.props.EnumProperty(items=ootEnumDrawLayers, default="Opaque", update=update_draw_layer) @@ -311,82 +331,30 @@ def F3DOrganizeLights(self, context): self.f3d_light7 = lightList[6] if len(lightList) > 6 else None -def combiner_uses(material, checkList): - is2Cycle = f3d_mat.rdp_settings.g_mdsft_cycletype == "G_CYC_2CYCLE" - display = False - for value in checkList: - if value[:5] == "TEXEL": - value1 = value - value2 = value.replace("0", "1") if "0" in value else value.replace("1", "0") - else: - value1 = value - value2 = value - - display |= material.combiner1.A == value1 - if is2Cycle: - display |= material.combiner2.A == value2 - - display |= material.combiner1.B == value1 - if is2Cycle: - display |= material.combiner2.B == value2 - - display |= material.combiner1.C == value1 - if is2Cycle: - display |= material.combiner2.C == value2 - - display |= material.combiner1.D == value1 - if is2Cycle: - display |= material.combiner2.D == value2 - - display |= material.combiner1.A_alpha == value1 - if is2Cycle: - display |= material.combiner2.A_alpha == value2 - - display |= material.combiner1.B_alpha == value1 - if is2Cycle: - display |= material.combiner2.B_alpha == value2 - - display |= material.combiner1.C_alpha == value1 - if is2Cycle: - display |= material.combiner2.C_alpha == value2 - - display |= material.combiner1.D_alpha == value1 - if is2Cycle: - display |= material.combiner2.D_alpha == value2 - - return display - - -def combiner_uses_alpha(material, checkList, is2Cycle): - display = False - for value in checkList: - if value[:5] == "TEXEL": - value1 = value - value2 = value.replace("0", "1") if "0" in value else value.replace("1", "0") - else: - value1 = value - value2 = value - - display |= material.combiner1.A_alpha == value1 - if is2Cycle: - display |= material.combiner2.A_alpha == value2 - - display |= material.combiner1.B_alpha == value1 - if is2Cycle: - display |= material.combiner2.B_alpha == value2 - - display |= material.combiner1.C_alpha == value1 - if is2Cycle: - display |= material.combiner2.C_alpha == value2 - - display |= material.combiner1.D_alpha == value1 - if is2Cycle: - display |= material.combiner2.D_alpha == value2 - - return display - - -CombinerUses = dict[str, bool] +def combiner_uses( + f3dMat: "F3DMaterialProperty", + checkList, + checkCycle1 = True, + checkCycle2 = True, + checkColor = True, + checkAlpha = True, + swapTexelsCycle2 = True, +): + is2Cycle = f3dMat.rdp_settings.g_mdsft_cycletype == "G_CYC_2CYCLE" + for i in range(1, 3): + if i == 1 and not checkCycle1 or i == 2 and (not checkCycle2 or not is2Cycle): + continue + combiner = getattr(f3dMat, f"combiner{i}") + for isAlpha in [False, True]: + if not isAlpha and not checkColor or isAlpha and not checkAlpha: + continue + for letter in ["A", "B", "C", "D"]: + value = getattr(combiner, letter + ("_alpha" if isAlpha else "")) + if i == 2 and swapTexelsCycle2 and value.startswith("TEXEL"): + value = "TEXEL" + chr(ord(value[5]) ^ 1) # Swap 0 and 1 + if value in checkList: + return True + return False def combiner_uses_tex0(f3d_mat: "F3DMaterialProperty"): @@ -397,7 +365,7 @@ def combiner_uses_tex1(f3d_mat: "F3DMaterialProperty"): return combiner_uses(f3d_mat, ["TEXEL1", "TEXEL1_ALPHA"]) -def all_combiner_uses(f3d_mat: "F3DMaterialProperty") -> CombinerUses: +def all_combiner_uses(f3d_mat: "F3DMaterialProperty") -> dict[str, bool]: use_tex0 = combiner_uses_tex0(f3d_mat) use_tex1 = combiner_uses_tex1(f3d_mat) @@ -415,8 +383,8 @@ def all_combiner_uses(f3d_mat: "F3DMaterialProperty") -> CombinerUses: "Shade": combiner_uses( f3d_mat, ["SHADE", "SHADE_ALPHA"] ), - "Shade Alpha": combiner_uses_alpha( - f3d_mat, ["SHADE"] + "Shade Alpha": combiner_uses( + f3d_mat, ["SHADE"], checkColor = False ), "Key": combiner_uses(f3d_mat, ["CENTER", "SCALE"]), "LOD Fraction": combiner_uses( @@ -927,25 +895,30 @@ class F3DPanel(Panel): def ui_cel_shading(self, material: Material, layout: UILayout): inputGroup = layout.box().column() - r = inputGroup.row() + r = inputGroup.row().split(factor=0.25) r.prop(material.f3d_mat, "use_cel_shading") if not material.f3d_mat.use_cel_shading: return cel = material.f3d_mat.cel_shading - r = inputGroup.row().split(factor=0.3) - r.label(text="Tint pipeline:") r = r.split(factor=0.3) + r.label(text="Tint pipeline:") r.prop(cel, "tintPipeline", text="") + r = inputGroup.row().split(factor=0.25) + r.label(text="") r = r.split(factor=0.3) r.label(text="Cutout:") r.prop(cel, "cutoutSource", text="") + if getZMode(material) != "ZMODE_OPA": + inputGroup.label(text = "zmode in blender / rendermode must be opaque.", icon = "ERROR") + if cel.cutoutSource == "ENVIRONMENT": if not material.f3d_mat.set_env or material.f3d_mat.env_color[3] != 1.0: inputGroup.label(text = "Enable env color, and set env alpha to 255.", icon = "ERROR") else: - if not combiner_uses(material, cel.cutoutSource): - inputGroup.label(text = "This texture does not exist.", icon = "ERROR") + tex = material.f3d_mat.tex0 if cel.cutoutSource == "TEXEL0" else material.f3d_mat.tex1 + if tex.tex is None or not tex.tex_set: + inputGroup.label(text = f"Texture {cel.cutoutSource[5]} is not set up correctly.", icon = "ERROR") if ( len(cel.levels) >= 3 and @@ -972,23 +945,19 @@ class F3DPanel(Panel): r.label(text="Tint:") r = r.split(factor=0.27) r.prop(level, "tintType", text="") + r = r.split(factor=0.45) if level.tintType == "Fixed": - r = r.split(factor=0.45) r.prop(level, "tintFixedLevel") r = r.split(factor=0.3) r.label(text="Color:") r.prop(level, "tintFixedColor", text="") elif level.tintType == "Segment": - r = r.split(factor=0.45) r.prop(level, "tintSegmentNum") r.prop(level, "tintSegmentOffset") showSegHelp = True elif level.tintType == "Light": - r = r.split(factor=0.45) r.prop(level, "tintFixedLevel") - r = r.split(factor=0.65) - r.label(text="Light (/end):") - r.prop(level, "tintLightSlot", text="") + r.prop(level, "tintLightSlot") else: raise PluginError("Invalid tintType") if showSegHelp: @@ -1102,8 +1071,9 @@ class F3DPanel(Panel): self.checkDrawLayersWarnings(f3dMat, useDict, layout) - def drawCCProps(ui: UILayout, combiner: "CombinerProperty", isAlpha: bool) -> None: + def drawCCProps(ui: UILayout, combiner: "CombinerProperty", isAlpha: bool, enabled: bool = True) -> None: ui = ui.column() + ui.enabled = enabled for letter in ["A", "B", "C", "D"]: r = ui.row().split(factor=0.25 if isAlpha else 0.1) r.label(text = f"{letter}{' Alpha' if isAlpha else ''}:") @@ -1116,16 +1086,9 @@ class F3DPanel(Panel): combinerCol = combinerBox.row().split(factor=0.45) combinerCol.enabled = f3dMat.set_combiner drawCCProps(combinerCol, f3dMat.combiner1, False) - + drawCCProps(combinerCol, f3dMat.combiner1, True, not f3dMat.use_cel_shading) if f3dMat.use_cel_shading: - r = combinerCol.column().box().column() - r.label(text = "") - r.label(text = f"CC alpha{' cycle 1' if isTwoCycle else ''} is") - r.label(text = "occupied by cel shading.") - r.label(text = "") - r.scale_y = 0.9 - else: - drawCCProps(combinerCol, f3dMat.combiner1, True) + r = combinerBox.column().label(text = f"CC alpha{' cycle 1' if isTwoCycle else ''} is occupied by cel shading.") if isTwoCycle: combinerBox2 = layout.box() @@ -1135,15 +1098,12 @@ class F3DPanel(Panel): drawCCProps(combinerCol2, f3dMat.combiner2, False) drawCCProps(combinerCol2, f3dMat.combiner2, True) - if useDict["Texture 0"]: - cc_list = ["A", "B", "C", "D", "A_alpha", "B_alpha", "C_alpha", "D_alpha"] - if len([c for c in cc_list if getattr(f3dMat.combiner2, c) == "TEXEL1"]): - combinerBox2.label( - text="Warning: Using 'Texture 1' in Cycle 2 can cause display issues!", - icon="LIBRARY_DATA_BROKEN", - ) + if combiner_uses(f3dMat, ["TEXEL0", "TEXEL0_ALPHA"], checkCycle1 = False, swapTexelsCycle2 = False): + combinerBox2.label(text = "'Texture 0' in Cycle 2 is actually Texture 1.", icon = "INFO") + if combiner_uses(f3dMat, ["TEXEL1", "TEXEL1_ALPHA"], checkCycle1 = False, swapTexelsCycle2 = False): + multilineLabel(combinerBox2, "RDP silicon bug: 'Texture 1' in Cycle 2 is actually\n" + + "Texture 0 for the NEXT pixel, causes visual issues.", "ORPHAN_DATA") - combinerBox2.label(text="Note: In second cycle, texture 0 and texture 1 are flipped.") if menuTab == "Sources": self.ui_uvCheck(layout, context) @@ -1348,6 +1308,24 @@ def update_light_properties(self, context): update_light_colors(material, context) +def update_cel_cutout_source(self, context): + with F3DMaterial_UpdateLock(get_material_from_context(context)) as material: + if not material: + return + if not material.f3d_mat.use_cel_shading: + return + + f3dMat = material.f3d_mat + cel = f3dMat.cel_shading + firstDarker = len(cel.levels) >= 1 and cel.levels[0].threshMode == "Darker" + + f3dMat.combiner1.A_alpha, f3dMat.combiner1.B_alpha = ( + ("1", "SHADE") if firstDarker else ("SHADE", "0") + ) + f3dMat.combiner1.C_alpha = cel.cutoutSource + f3dMat.combiner1.D_alpha = "0" + + def getSocketFromCombinerToNodeDictColor(nodes, combinerInput): nodeName, socketIndex = combinerToNodeDictColor[combinerInput] return nodes[nodeName].outputs[socketIndex] if nodeName is not None else None @@ -3202,7 +3180,12 @@ class DefaultRDPSettingsPanel(Panel): class CelLevelProperty(PropertyGroup): - threshMode : bpy.props.EnumProperty(items = enumCelThreshMode, name = "Draw when", default = "Lighter") + threshMode : bpy.props.EnumProperty( + items = enumCelThreshMode, + name = "Draw when", + default = "Lighter", + update = update_cel_cutout_source + ) threshold : bpy.props.IntProperty( name = "Threshold", description = "Light level at which the boundary between cel levels occurs. One level is >= this value, the other is < it", @@ -3240,7 +3223,7 @@ class CelLevelProperty(PropertyGroup): default = 0, ) tintLightSlot : bpy.props.IntProperty( - name = "Light slot (from end)", + name = "Light (/end)", description = "Which light to load RGB color from, counting from the end. 0 = ambient, 1 = last directional / point light, 2 = second-to-last, etc.", min = 0, max = 9, @@ -3250,7 +3233,12 @@ class CelLevelProperty(PropertyGroup): class CelShadingProperty(PropertyGroup): tintPipeline : bpy.props.EnumProperty(items = enumCelTintPipeline, name = "Tint pipeline", default = "CC") - cutoutSource : bpy.props.EnumProperty(items = enumCelCutoutSource, name = "Cutout", default = "ENVIRONMENT") + cutoutSource : bpy.props.EnumProperty( + items = enumCelCutoutSource, + name = "Cutout", + default = "ENVIRONMENT", + update = update_cel_cutout_source, + ) levels : bpy.props.CollectionProperty(type = CelLevelProperty, name = "Cel levels") @@ -4011,7 +3999,7 @@ class F3DMaterialProperty(PropertyGroup): use_large_textures: bpy.props.BoolProperty(name="Large Texture Mode") large_edges: bpy.props.EnumProperty(items=enumLargeEdges, default="Clamp") - use_cel_shading : bpy.props.BoolProperty(name = "Cel Shading") + use_cel_shading : bpy.props.BoolProperty(name = "Cel Shading", update = update_cel_cutout_source) cel_shading : bpy.props.PointerProperty(type = CelShadingProperty) def key(self) -> F3DMaterialHash: diff --git a/fast64_internal/f3d/f3d_writer.py b/fast64_internal/f3d/f3d_writer.py index 8a533c9..360a943 100644 --- a/fast64_internal/f3d/f3d_writer.py +++ b/fast64_internal/f3d/f3d_writer.py @@ -1,4 +1,4 @@ -from typing import Union, Optional, Callable, Any +from typing import Union, Optional, Callable, Any, List from dataclasses import dataclass import functools import bpy, mathutils, os, re, copy, math @@ -910,14 +910,17 @@ class TriangleConverter: celTriList.commands.append(SPEndDisplayList()) self.writeCelLevels(celTriList = celTriList) - def writeCelLevels(self, celTriList: Optional[GfxList] = None, triCmds: Optional[List[GbiMacro]] = None): + def writeCelLevels(self, celTriList: Optional[GfxList] = None, triCmds: Optional[List[GbiMacro]] = None) -> None: + assert (celTriList == None) != (triCmds == None) settings = self.material.f3d_mat.rdp_settings cel = self.material.f3d_mat.cel_shading f3d = get_F3D_GBI() # Don't want to have to change back and forth arbitrarily between decal and # opaque mode. So if you're using both lighter and darker, need to do those - # first before switching to opaque. + # first before switching to decal. + if getZMode(self.material) != "ZMODE_OPA": + raise PluginError(f"Material {self.material.name} with cel shading: zmode in blender / rendermode must be opaque.", icon = "ERROR") wroteLighter = wroteDarker = usesDecal = False if len(cel.levels): raise PluginError(f"Material {self.material.name} with cel shading has no cel levels") @@ -926,13 +929,13 @@ class TriangleConverter: if wroteDarker: usesDecal = True elif usesDecal: - raise PluginError("Must use Lighter and Darker cel levels before duplicating either of them") + raise PluginError(f"Material {self.material.name}: must use Lighter and Darker cel levels before duplicating either of them") wroteDarker = True else: if wroteLighter: usesDecal = True elif usesDecal: - raise PluginError("Must use Lighter and Darker cel levels before duplicating either of them") + raise PluginError(f"Material {self.material.name}: must use Lighter and Darker cel levels before duplicating either of them") wroteLighter = True wroteLighter = wroteDarker = wroteOpaque = wroteDecal = False @@ -940,12 +943,7 @@ class TriangleConverter: for level in cel.levels: darker = level.threshMode == "Darker" self.triList.commands.append(DPPipeSync()) - if usesDecal: - if not wroteOpaque: - wroteOpaque = True - self.triList.commands.append(SPSetOtherMode("G_SETOTHERMODE_L", - 10, 2, ["ZMODE_OPA"])) - elif not wroteDecal and (darker and wroteDarker or not darker and wroteLighter): + if usesDecal and not wroteDecal and (darker and wroteDarker or not darker and wroteLighter): wroteDecal = True self.triList.commands.append(SPSetOtherMode("G_SETOTHERMODE_L", 10, 2, ["ZMODE_DEC"])) @@ -954,9 +952,9 @@ class TriangleConverter: else: wroteLighter = True - if lastDarker != darker: + if lastDarker != darker and lastDarker is not None: lastDarker = darker - # Set up CC + # Set up CC. CC for first cel level is set up in material. ccSettings = [] for prop in ["A", "B", "C", "D"]: ccSettings.append(getattr(settings.combiner1, prop)) @@ -984,8 +982,17 @@ class TriangleConverter: GfxListTag.Material, DLFormat.Static ))) + elif level.tintType == "Light": + if cel.tintPipeline == "CC": + self.triList.commands.append(SPLightToPrimColor( + level.tintLightSlot, level.tintFixedLevel, 0, 0 + )) + else: + self.triList.commands.append(SPLightToFogColor( + level.tintLightSlot, level.tintFixedLevel + )) else: - pass # TODO light to RDP + raise PluginError("Unknown tint type") # Set up threshold self.triList.commands.append(DPSetBlendColor(255, 255, 255, @@ -1004,9 +1011,6 @@ class TriangleConverter: # Disable alpha compare culling for future DLs self.triList.commands.append(SPAlphaCompareCull( f3d.G_ALPHA_COMPARE_CULL_DISABLE, 0)) - - - def addFace(self, face, stOffset): triIndices = [] From 0f1e9755cd9ccd95eacd6b6078f4069bfab5f3a4 Mon Sep 17 00:00:00 2001 From: Sauraen Date: Thu, 26 Oct 2023 22:02:32 -0700 Subject: [PATCH 37/74] Fixed some bugs with cel writing --- fast64_internal/f3d/f3d_gbi.py | 20 +++++++++++++---- fast64_internal/f3d/f3d_material.py | 1 - fast64_internal/f3d/f3d_writer.py | 35 ++++++++++++++++++----------- 3 files changed, 38 insertions(+), 18 deletions(-) diff --git a/fast64_internal/f3d/f3d_gbi.py b/fast64_internal/f3d/f3d_gbi.py index ae667d4..7e196f1 100644 --- a/fast64_internal/f3d/f3d_gbi.py +++ b/fast64_internal/f3d/f3d_gbi.py @@ -3773,12 +3773,18 @@ class SPAttrOffsetZ(GbiMacro): @dataclass(unsafe_hash=True) class SPNormalsMode(GbiMacro): - mode: int + mode: str def to_binary(self, f3d, segments): if not f3d.F3DEX_GBI_3: raise PluginError("SPNormalsMode requires F3DEX3 microcode") - return gsMoveWd(f3d.G_MW_FX, f3d.G_MWO_NORMALS_MODE, mode, f3d) + if self.mode == "G_NORMALS_MODE_FAST": + modeVal = f3d.G_NORMALS_MODE_FAST + elif self.mode == "G_NORMALS_MODE_AUTO": + modeVal = f3d.G_NORMALS_MODE_AUTO + elif self.mode == "G_NORMALS_MODE_MANUAL": + modeVal = f3d.G_NORMALS_MODE_MANUAL + return gsMoveWd(f3d.G_MW_FX, f3d.G_MWO_NORMALS_MODE, modeVal, f3d) # F3DEX3 TODO: SPMITMatrix @@ -3786,14 +3792,20 @@ class SPNormalsMode(GbiMacro): @dataclass(unsafe_hash=True) class SPAlphaCompareCull(GbiMacro): - mode: int + mode: str thresh: int def to_binary(self, f3d, segments): if not f3d.F3DEX_GBI_3: raise PluginError("SPAlphaCompareCull requires F3DEX3 microcode") + if self.mode == "G_ALPHA_COMPARE_CULL_DISABLE": + modeVal = f3d.G_ALPHA_COMPARE_CULL_DISABLE + elif self.mode == "G_ALPHA_COMPARE_CULL_BELOW": + modeVal = f3d.G_ALPHA_COMPARE_CULL_BELOW + elif self.mode == "G_ALPHA_COMPARE_CULL_ABOVE": + modeVal = f3d.G_ALPHA_COMPARE_CULL_ABOVE return gsMoveWd( - f3d.G_MW_FX, f3d.G_MWO_ALPHA_COMPARE_CULL, (_SHIFTL(self.mode, 24, 8) | _SHIFTL(self.thresh, 16, 8)), f3d + f3d.G_MW_FX, f3d.G_MWO_ALPHA_COMPARE_CULL, (_SHIFTL(modeVal, 24, 8) | _SHIFTL(self.thresh, 16, 8)), f3d ) diff --git a/fast64_internal/f3d/f3d_material.py b/fast64_internal/f3d/f3d_material.py index bb26696..ecc7a24 100644 --- a/fast64_internal/f3d/f3d_material.py +++ b/fast64_internal/f3d/f3d_material.py @@ -277,7 +277,6 @@ def getZMode(material: Material): return enumZMode[zmode][0] - class DrawLayerProperty(PropertyGroup): sm64: bpy.props.EnumProperty(items=sm64EnumDrawLayers, default="1", update=update_draw_layer) oot: bpy.props.EnumProperty(items=ootEnumDrawLayers, default="Opaque", update=update_draw_layer) diff --git a/fast64_internal/f3d/f3d_writer.py b/fast64_internal/f3d/f3d_writer.py index 360a943..b3e3e8c 100644 --- a/fast64_internal/f3d/f3d_writer.py +++ b/fast64_internal/f3d/f3d_writer.py @@ -11,6 +11,7 @@ from .f3d_constants import * from .f3d_material import ( all_combiner_uses, getMaterialScrollDimensions, + getZMode, isTexturePointSampled, RDPSettings, ) @@ -807,7 +808,7 @@ class TriangleConverter: self.triGroup = triGroup self.triList = triGroup.triList - self.vtxList = triGroup.vtxList + self.vtxList = triGroup.vertexList self.material = material uv_data = triConverterInfo.obj.data.uv_layers["UVMap"].data @@ -912,8 +913,8 @@ class TriangleConverter: def writeCelLevels(self, celTriList: Optional[GfxList] = None, triCmds: Optional[List[GbiMacro]] = None) -> None: assert (celTriList == None) != (triCmds == None) - settings = self.material.f3d_mat.rdp_settings - cel = self.material.f3d_mat.cel_shading + f3dMat = self.material.f3d_mat + cel = f3dMat.cel_shading f3d = get_F3D_GBI() # Don't want to have to change back and forth arbitrarily between decal and @@ -922,7 +923,7 @@ class TriangleConverter: if getZMode(self.material) != "ZMODE_OPA": raise PluginError(f"Material {self.material.name} with cel shading: zmode in blender / rendermode must be opaque.", icon = "ERROR") wroteLighter = wroteDarker = usesDecal = False - if len(cel.levels): + if len(cel.levels) == 0: raise PluginError(f"Material {self.material.name} with cel shading has no cel levels") for level in cel.levels: if level.threshMode == "Darker": @@ -938,12 +939,20 @@ class TriangleConverter: raise PluginError(f"Material {self.material.name}: must use Lighter and Darker cel levels before duplicating either of them") wroteLighter = True + # Because this might not be the first tri list in the object with this + # material, we have to set things even if they were set up already in + # the material. wroteLighter = wroteDarker = wroteOpaque = wroteDecal = False lastDarker = None for level in cel.levels: darker = level.threshMode == "Darker" self.triList.commands.append(DPPipeSync()) - if usesDecal and not wroteDecal and (darker and wroteDarker or not darker and wroteLighter): + if usesDecal: + if not wroteOpaque: + wroteOpaque = True + self.triList.commands.append(SPSetOtherMode("G_SETOTHERMODE_L", + 10, 2, ["ZMODE_OPA"])) + if not wroteDecal and (darker and wroteDarker or not darker and wroteLighter): wroteDecal = True self.triList.commands.append(SPSetOtherMode("G_SETOTHERMODE_L", 10, 2, ["ZMODE_DEC"])) @@ -952,17 +961,17 @@ class TriangleConverter: else: wroteLighter = True - if lastDarker != darker and lastDarker is not None: + if lastDarker != darker: lastDarker = darker - # Set up CC. CC for first cel level is set up in material. + # Set up CC. ccSettings = [] for prop in ["A", "B", "C", "D"]: - ccSettings.append(getattr(settings.combiner1, prop)) + ccSettings.append(getattr(f3dMat.combiner1, prop)) ccSettings.extend(["1", "SHADE"] if darker else ["SHADE", "0"]) ccSettings.extend([cel.cutoutSource, "0"]) - if settings.g_mdsft_cycletype == "G_CYC_2CYCLE": + if f3dMat.rdp_settings.g_mdsft_cycletype == "G_CYC_2CYCLE": for prop in ["A", "B", "C", "D", "A_alpha", "B_alpha", "C_alpha", "D_alpha"]: - ccSettings.append(getattr(settings.combiner2, prop)) + ccSettings.append(getattr(f3dMat.combiner2, prop)) else: ccSettings *= 2 self.triList.commands.append(DPSetCombineMode(*ccSettings)) @@ -998,8 +1007,8 @@ class TriangleConverter: self.triList.commands.append(DPSetBlendColor(255, 255, 255, 0x101 - level.threshold if darker else level.threshold)) self.triList.commands.append(SPAlphaCompareCull( - f3d.G_ALPHA_COMPARE_CULL_ABOVE if darker else - f3d.G_ALPHA_COMPARE_CULL_BELOW, + "G_ALPHA_COMPARE_CULL_ABOVE" if darker else + "G_ALPHA_COMPARE_CULL_BELOW", level.threshold)) # Draw tris, inline or by call @@ -1010,7 +1019,7 @@ class TriangleConverter: # Disable alpha compare culling for future DLs self.triList.commands.append(SPAlphaCompareCull( - f3d.G_ALPHA_COMPARE_CULL_DISABLE, 0)) + "G_ALPHA_COMPARE_CULL_DISABLE", 0)) def addFace(self, face, stOffset): triIndices = [] From 23e5fa9a24950179c0d3596c13fbc296c97f09c1 Mon Sep 17 00:00:00 2001 From: Sauraen Date: Sat, 28 Oct 2023 17:24:14 -0700 Subject: [PATCH 38/74] Fixed small bugs --- fast64_internal/f3d/f3d_writer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fast64_internal/f3d/f3d_writer.py b/fast64_internal/f3d/f3d_writer.py index b3e3e8c..d1b4216 100644 --- a/fast64_internal/f3d/f3d_writer.py +++ b/fast64_internal/f3d/f3d_writer.py @@ -987,7 +987,7 @@ class TriangleConverter: color[1], color[2], level.tintFixedLevel)) elif level.tintType == "Segment": self.triList.commands.append(SPDisplayList(GfxList( - f"{level.tintSegmentNum:#02X}{level.tintSegmentOffset * 8:06X}", + f"{level.tintSegmentNum:#04x}{level.tintSegmentOffset * 8:06x}", GfxListTag.Material, DLFormat.Static ))) From a0a38ad849143e63e2eb6a0ee644151ad0bdbb78 Mon Sep 17 00:00:00 2001 From: Sauraen Date: Sat, 28 Oct 2023 17:51:29 -0700 Subject: [PATCH 39/74] Converted some things to f-strings --- fast64_internal/f3d/f3d_gbi.py | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/fast64_internal/f3d/f3d_gbi.py b/fast64_internal/f3d/f3d_gbi.py index 4e70e54..bc290d4 100644 --- a/fast64_internal/f3d/f3d_gbi.py +++ b/fast64_internal/f3d/f3d_gbi.py @@ -54,7 +54,7 @@ dlTypeEnum = [ ] # 1-8 for F3DEX2 etc., 1-10 for F3DEX3 -lightIndex = {"LIGHT_" + str(n): n for n in range(1, 11)} +lightIndex = {f"LIGHT_{n}": n for n in range(1, 11)} # tuple of max buffer size, max load count. vertexBufferSize = { @@ -3920,7 +3920,8 @@ class SPSetLights(GbiMacro): return offsets def to_binary(self, f3d, segments): - data = SPNumLights("NUMLIGHTS_" + str(len(self.lights.l))).to_binary(f3d, segments) + n = len(self.lights.l) + data = SPNumLights(f"NUMLIGHTS_{n}").to_binary(f3d, segments) if f3d.F3DEX_GBI_3: data += gsDma2p( f3d.G_MOVEMEM, self.lights.startAddress, len(self.lights.l) * 0x10 + 8, f3d.G_MV_LIGHT, 0x10 @@ -3933,19 +3934,14 @@ class SPSetLights(GbiMacro): else: for i in range(len(self.lights.l)): data += SPLight(self.lights.getLightPointer(i), "LIGHT_" + str(i + 1)).to_binary(f3d, segments) - data += SPLight(self.lights.getAmbientPointer(), "LIGHT_" + str(len(self.lights.l) + 1)).to_binary( - f3d, segments - ) + data += SPLight(self.lights.getAmbientPointer(), "LIGHT_" + str(n + 1)).to_binary(f3d, segments) return data def to_c(self, static=True): - header = ( - "gsSPSetLights" + str(len(self.lights.l)) + "(" - if static - else "gSPSetLights" + str(len(self.lights.l)) + "(glistp++, " - ) + n = len(self.lights.l) + header = f"gsSPSetLights{n}(" if static else f"gSPSetLights{n}(glistp++, " if not static and bpy.context.scene.decomp_compatible: - header += "(*(Lights" + str(len(self.lights.l)) + "*) segmented_to_virtual(&" + self.lights.name + "))" + header += f"(*(Lights{n}*) segmented_to_virtual(&{self.lights.name}))" else: header += self.lights.name return header + ")" From 000ff56a660845ba4993e912fecf937957f32059 Mon Sep 17 00:00:00 2001 From: Sauraen Date: Sat, 28 Oct 2023 21:16:27 -0700 Subject: [PATCH 40/74] Fixed import issues --- fast64_internal/f3d/f3d_parser.py | 68 +++++++++++++++---------------- 1 file changed, 32 insertions(+), 36 deletions(-) diff --git a/fast64_internal/f3d/f3d_parser.py b/fast64_internal/f3d/f3d_parser.py index ea8ac8b..cda960e 100644 --- a/fast64_internal/f3d/f3d_parser.py +++ b/fast64_internal/f3d/f3d_parser.py @@ -1,5 +1,6 @@ from typing import Union import bmesh, bpy, mathutils, re, math, traceback +from mathutils import Vector from bpy.utils import register_class, unregister_class from .f3d_gbi import * from .f3d_material import ( @@ -257,7 +258,7 @@ def interpretLoadVertices(romfile, vertexBuffer, transformMatrix, command, segme data = romfile.read(dataLength) for i in range(numVerts): - vert = mathutils.Vector(readVectorFromShorts(data, i * 16)) + vert = Vector(readVectorFromShorts(data, i * 16)) vert = transformMatrix @ vert transformedVert = bytearray(6) writeVectorToShorts(transformedVert, 0, vert) @@ -276,9 +277,9 @@ def interpretDrawTriangle(command, vertexBuffer, faceSeq, vertSeq, uv_layer, def index1 = int(command[6] / 0x0A) index2 = int(command[7] / 0x0A) - vert0 = mathutils.Vector(getPosition(vertexBuffer, index0)) - vert1 = mathutils.Vector(getPosition(vertexBuffer, index1)) - vert2 = mathutils.Vector(getPosition(vertexBuffer, index2)) + vert0 = Vector(getPosition(vertexBuffer, index0)) + vert1 = Vector(getPosition(vertexBuffer, index1)) + vert2 = Vector(getPosition(vertexBuffer, index2)) verts[0] = vertSeq.new(vert0) verts[1] = vertSeq.new(vert1) @@ -292,7 +293,7 @@ def interpretDrawTriangle(command, vertexBuffer, faceSeq, vertSeq, uv_layer, def loopIndex = 0 for loop in tri.loops: - loop[uv_layer].uv = mathutils.Vector(getUV(vertexBuffer, int(command[5 + loopIndex] / 0x0A))) + loop[uv_layer].uv = Vector(getUV(vertexBuffer, int(command[5 + loopIndex] / 0x0A))) loopIndex += 1 return verts @@ -641,7 +642,7 @@ class F3DContext: mat = self.mat() f3dVert = bufferVert.f3dVert - position = transform @ mathutils.Vector(f3dVert.position) + position = transform @ Vector(f3dVert.position) if mat.tex0.tex is not None: texDimensions = mat.tex0.tex.size elif mat.tex0.use_tex_reference: @@ -657,14 +658,14 @@ class F3DContext: uv[1] = 1 - uv[1] has_rgb, has_normal, has_packed_normals = getRgbNormalSettings(self.mat()) - rgb = mathutils.Vector([v / 0xFF for v in f3dVert.rgb]) if has_rgb else None + rgb = Vector([v / 0xFF for v in f3dVert.rgb]) if has_rgb else Vector([1.0, 1.0, 1.0]) alpha = f3dVert.alpha / 0xFF - normal = None + normal = Vector([0.0, 0.0, 0.0]) # Zero normal makes normals_split_custom_set use auto if has_normal: if has_packed_normals: normal = f3dVert.normal else: - normal = mathutils.Vector([v - 0x100 if v >= 0x80 else v for v in f3dVert.rgb]).normalized() + normal = Vector([v - 0x100 if v >= 0x80 else v for v in f3dVert.rgb]).normalized() normal = (transform.inverted().transposed() @ normal).normalized() # NOTE: The groupIndex here does NOT correspond to a vertex group, but to the name of the limb (c variable) @@ -1178,9 +1179,9 @@ class F3DContext: lightObj.rotation_euler = ( mathutils.Euler((0, 0, math.pi)).to_quaternion() - @ ( - mathutils.Euler((math.pi / 2, 0, 0)).to_quaternion() @ mathutils.Vector(light.normal) - ).rotation_difference(mathutils.Vector((0, 0, 1))) + @ (mathutils.Euler((math.pi / 2, 0, 0)).to_quaternion() @ Vector(light.normal)).rotation_difference( + Vector((0, 0, 1)) + ) ).to_euler() # lightObj.rotation_euler[0] *= 1 bLight.color = light.color @@ -1204,7 +1205,7 @@ class F3DContext: self.mat().set_lights = True lightIndex = self.getLightIndex(command.params[0]) colorData = math_eval(command.params[1], self.f3d) - color = mathutils.Vector( + color = Vector( [((colorData >> 24) & 0xFF) / 0xFF, ((colorData >> 16) & 0xFF) / 0xFF, ((colorData >> 8) & 0xFF) / 0xFF] ) @@ -1262,17 +1263,17 @@ class F3DContext: def createLights(self, data, lightsName): numLights, lightValues = parseLightsData(data, lightsName, self) - ambientColor = mathutils.Vector(gammaInverse([value / 255 for value in lightValues[0:3]])) + ambientColor = Vector(gammaInverse([value / 255 for value in lightValues[0:3]])) lightList = [] for i in range(numLights): - color = mathutils.Vector(gammaInverse([value / 255 for value in lightValues[3 + 6 * i : 3 + 6 * i + 3]])) - direction = mathutils.Vector(bytesToNormal(lightValues[3 + 6 * i + 3 : 3 + 6 * i + 6])) + color = Vector(gammaInverse([value / 255 for value in lightValues[3 + 6 * i : 3 + 6 * i + 3]])) + direction = Vector(bytesToNormal(lightValues[3 + 6 * i + 3 : 3 + 6 * i + 6])) lightList.append(Light(color, direction)) while len(lightList) < 7: - lightList.append(Light(mathutils.Vector([0, 0, 0]), mathutils.Vector([0x28, 0x28, 0x28]))) + lightList.append(Light(Vector([0, 0, 0]), Vector([0x28, 0x28, 0x28]))) # normally a and l are Ambient and Light objects, # but here they will be a color and blender light object array. @@ -1828,7 +1829,6 @@ class F3DContext: color_layer = mesh.vertex_colors.new(name="Col").data for i in range(len(mesh.loops)): - # if self.materialContext.f3d_mat.rdp_settings.g_lighting: color_layer[i].color = self.verts[i].rgb.to_4d() alpha_layer = mesh.vertex_colors.new(name="Alpha").data @@ -1855,7 +1855,7 @@ class F3DContext: i = 0 for key, lightObj in self.lightData.items(): - lightObj.location = bpy.context.scene.cursor.location + mathutils.Vector((i, 0, 0)) + lightObj.location = bpy.context.scene.cursor.location + Vector((i, 0, 0)) i += 1 self.clearGeometry() @@ -1956,24 +1956,20 @@ def parseVertexData(dlData: str, vertexDataName: str, f3dContext: F3DContext): vertexData = [] for pattern in patterns: # For this step, store rgb/normal as rgb and packed normal as normal. - vertexData = [ - F3DVert( - mathutils.Vector( - [math_eval(match.group(1), f3d), math_eval(match.group(2), f3d), math_eval(match.group(3), f3d)] - ), - mathutils.Vector([math_eval(match.group(5), f3d), math_eval(match.group(6), f3d)]), - mathutils.Vector( - [ - math_eval(match.group(7), f3d), - math_eval(match.group(8), f3d), - math_eval(match.group(9), f3d), - ] - ), - unpackNormal(math_eval(match.group(4), f3d)), - math_eval(match.group(10), f3d), + for match in re.finditer(pattern, data, re.DOTALL): + values = [math_eval(g, f3d) for g in match.groups()] + if len(values) == 9: + # A format without the flag / packed normal + values = values[0:3] + [0] + values[3:9] + vertexData.append( + F3DVert( + Vector(values[0:3]), + Vector(values[4:6]), + Vector(values[6:9]), + unpackNormal(values[3]), + values[9], + ) ) - for match in re.finditer(pattern, data, re.DOTALL) - ] if len(vertexData) > 0: break f3dContext.vertexData[vertexDataName] = vertexData From 1069f271668955c049539acee1683c99b7f42a94 Mon Sep 17 00:00:00 2001 From: Sauraen Date: Sun, 29 Oct 2023 10:58:01 -0700 Subject: [PATCH 41/74] Fixed bug with normals import --- fast64_internal/utility.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fast64_internal/utility.py b/fast64_internal/utility.py index 6654118..5f397f3 100644 --- a/fast64_internal/utility.py +++ b/fast64_internal/utility.py @@ -1482,8 +1482,8 @@ def packNormal(normal: Vector) -> int: def getRgbNormalSettings(f3d_mat: "F3DMaterialProperty") -> Tuple[bool, bool, bool]: rdp_settings = f3d_mat.rdp_settings - has_packed_normals = bpy.context.scene.f3d_type == "F3DEX3" - has_rgb = not rdp_settings.g_lighting or (has_packed_normals and rdp_settings.g_packed_normals) + has_packed_normals = bpy.context.scene.f3d_type == "F3DEX3" and rdp_settings.g_packed_normals + has_rgb = not rdp_settings.g_lighting or has_packed_normals has_normal = rdp_settings.g_lighting return has_rgb, has_normal, has_packed_normals From fd4ac4a79b1840b8027e36172fecbfc4b06e5e5d Mon Sep 17 00:00:00 2001 From: Sauraen Date: Sun, 29 Oct 2023 22:23:14 -0700 Subject: [PATCH 42/74] Fixed cel threshold and temporarily disabled alpha compare threshold --- fast64_internal/f3d/f3d_writer.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/fast64_internal/f3d/f3d_writer.py b/fast64_internal/f3d/f3d_writer.py index d1b4216..22fabc8 100644 --- a/fast64_internal/f3d/f3d_writer.py +++ b/fast64_internal/f3d/f3d_writer.py @@ -1005,11 +1005,11 @@ class TriangleConverter: # Set up threshold self.triList.commands.append(DPSetBlendColor(255, 255, 255, - 0x101 - level.threshold if darker else level.threshold)) - self.triList.commands.append(SPAlphaCompareCull( - "G_ALPHA_COMPARE_CULL_ABOVE" if darker else - "G_ALPHA_COMPARE_CULL_BELOW", - level.threshold)) + 0x100 - level.threshold if darker else level.threshold)) + # self.triList.commands.append(SPAlphaCompareCull( + # "G_ALPHA_COMPARE_CULL_ABOVE" if darker else + # "G_ALPHA_COMPARE_CULL_BELOW", + # level.threshold)) # Draw tris, inline or by call if triCmds is not None: @@ -1018,8 +1018,8 @@ class TriangleConverter: self.triList.commands.append(SPDisplayList(celTriList)) # Disable alpha compare culling for future DLs - self.triList.commands.append(SPAlphaCompareCull( - "G_ALPHA_COMPARE_CULL_DISABLE", 0)) + # self.triList.commands.append(SPAlphaCompareCull( + # "G_ALPHA_COMPARE_CULL_DISABLE", 0)) def addFace(self, face, stOffset): triIndices = [] From c6d69a3b20be52c653676eed17bf28ea439afc52 Mon Sep 17 00:00:00 2001 From: Sauraen Date: Tue, 7 Nov 2023 21:20:01 -0800 Subject: [PATCH 43/74] Re-enabled alpha compare culling --- fast64_internal/f3d/f3d_writer.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/fast64_internal/f3d/f3d_writer.py b/fast64_internal/f3d/f3d_writer.py index 22fabc8..38efb33 100644 --- a/fast64_internal/f3d/f3d_writer.py +++ b/fast64_internal/f3d/f3d_writer.py @@ -1006,10 +1006,10 @@ class TriangleConverter: # Set up threshold self.triList.commands.append(DPSetBlendColor(255, 255, 255, 0x100 - level.threshold if darker else level.threshold)) - # self.triList.commands.append(SPAlphaCompareCull( - # "G_ALPHA_COMPARE_CULL_ABOVE" if darker else - # "G_ALPHA_COMPARE_CULL_BELOW", - # level.threshold)) + self.triList.commands.append(SPAlphaCompareCull( + "G_ALPHA_COMPARE_CULL_ABOVE" if darker else + "G_ALPHA_COMPARE_CULL_BELOW", + level.threshold)) # Draw tris, inline or by call if triCmds is not None: @@ -1018,8 +1018,8 @@ class TriangleConverter: self.triList.commands.append(SPDisplayList(celTriList)) # Disable alpha compare culling for future DLs - # self.triList.commands.append(SPAlphaCompareCull( - # "G_ALPHA_COMPARE_CULL_DISABLE", 0)) + self.triList.commands.append(SPAlphaCompareCull( + "G_ALPHA_COMPARE_CULL_DISABLE", 0)) def addFace(self, face, stOffset): triIndices = [] From 01988e623e4f055946a92faa8b58df6914559651 Mon Sep 17 00:00:00 2001 From: kurethedead Date: Wed, 15 Nov 2023 16:26:27 -0800 Subject: [PATCH 44/74] Fixed shader node changes --- fast64_internal/f3d/f3d_material.py | 64 +++++++++++++++++++++-------- 1 file changed, 46 insertions(+), 18 deletions(-) diff --git a/fast64_internal/f3d/f3d_material.py b/fast64_internal/f3d/f3d_material.py index e76e6ba..0cd4c01 100644 --- a/fast64_internal/f3d/f3d_material.py +++ b/fast64_internal/f3d/f3d_material.py @@ -933,7 +933,7 @@ class F3DPanel(Panel): lightFxPrereq = isF3DEX3 and settings.g_lighting blendUse = all_blender_uses(settings) - anyUseShadeAlpha = useDict["Shade Alpha"] or blendUse["Shade Alpha"] + anyUseShadeAlpha = useDict["Shade Alpha"] or (blendUse is not None and blendUse["Shade Alpha"]) g_lighting = settings.g_lighting g_fog = settings.g_fog @@ -1953,17 +1953,14 @@ def update_preset_manual(material, context): def update_preset_manual_v4(material, preset): - override = bpy.context.copy() - override["material"] = material if preset == "Shaded Solid": preset = "sm64_shaded_solid" if preset == "Shaded Texture": preset = "sm64_shaded_texture" if preset.lower() != "custom": material.f3d_update_flag = True - bpy.ops.script.execute_preset( - override, filepath=findF3DPresetPath(preset), menu_idname="MATERIAL_MT_f3d_presets" - ) + with bpy.context.temp_override(material=material): + bpy.ops.script.execute_preset(filepath=findF3DPresetPath(preset), menu_idname="MATERIAL_MT_f3d_presets") material.f3d_update_flag = False @@ -2024,18 +2021,49 @@ def createOrUpdateSceneProperties(): new_group["version"] = SCENE_PROPERTIES_VERSION # Create outputs - _nodeFogEnable: NodeSocketInt = new_group.outputs.new("NodeSocketInt", "FogEnable") - _nodeFogColor: NodeSocketColor = new_group.outputs.new("NodeSocketColor", "FogColor") - _nodeF3D_NearClip: NodeSocketFloat = new_group.outputs.new("NodeSocketFloat", "F3D_NearClip") - _nodeF3D_FarClip: NodeSocketFloat = new_group.outputs.new("NodeSocketFloat", "F3D_FarClip") - _nodeBlender_Game_Scale: NodeSocketFloat = new_group.outputs.new("NodeSocketFloat", "Blender_Game_Scale") - _nodeFogNear: NodeSocketInt = new_group.outputs.new("NodeSocketInt", "FogNear") - _nodeFogFar: NodeSocketInt = new_group.outputs.new("NodeSocketInt", "FogFar") - _nodeShadeColor: NodeSocketColor = new_group.outputs.new("NodeSocketColor", "ShadeColor") - _nodeAmbientColor: NodeSocketColor = new_group.outputs.new("NodeSocketColor", "AmbientColor") - _nodeLightDirection: NodeSocketVectorDirection = new_group.outputs.new( - "NodeSocketVectorDirection", "LightDirection" - ) + if bpy.app.version >= (4, 0, 0): + tree_interface = new_group.interface + + _nodeFogEnable: NodeSocketFloat = tree_interface.new_socket( + "FogEnable", socket_type="NodeSocketFloat", in_out="OUTPUT" + ) + _nodeFogColor: NodeSocketColor = tree_interface.new_socket( + "FogColor", socket_type="NodeSocketColor", in_out="OUTPUT" + ) + _nodeF3D_NearClip: NodeSocketFloat = tree_interface.new_socket( + "F3D_NearClip", socket_type="NodeSocketFloat", in_out="OUTPUT" + ) + _nodeF3D_FarClip: NodeSocketFloat = tree_interface.new_socket( + "F3D_FarClip", socket_type="NodeSocketFloat", in_out="OUTPUT" + ) + _nodeBlender_Game_Scale: NodeSocketFloat = tree_interface.new_socket( + "Blender_Game_Scale", socket_type="NodeSocketFloat", in_out="OUTPUT" + ) + _nodeFogNear: NodeSocketFloat = tree_interface.new_socket("FogNear", socket_type="NodeSocketFloat", in_out="OUTPUT") + _nodeFogFar: NodeSocketFloat = tree_interface.new_socket("FogFar", socket_type="NodeSocketFloat", in_out="OUTPUT") + _nodeShadeColor: NodeSocketColor = tree_interface.new_socket( + "ShadeColor", socket_type="NodeSocketColor", in_out="OUTPUT" + ) + _nodeAmbientColor: NodeSocketColor = tree_interface.new_socket( + "AmbientColor", socket_type="NodeSocketColor", in_out="OUTPUT" + ) + _nodeLightDirection: NodeSocketVector = tree_interface.new_socket( + "LightDirection", socket_type="NodeSocketVector", in_out="OUTPUT" + ) + + else: + _nodeFogEnable: NodeSocketInt = new_group.outputs.new("NodeSocketInt", "FogEnable") + _nodeFogColor: NodeSocketColor = new_group.outputs.new("NodeSocketColor", "FogColor") + _nodeF3D_NearClip: NodeSocketFloat = new_group.outputs.new("NodeSocketFloat", "F3D_NearClip") + _nodeF3D_FarClip: NodeSocketFloat = new_group.outputs.new("NodeSocketFloat", "F3D_FarClip") + _nodeBlender_Game_Scale: NodeSocketFloat = new_group.outputs.new("NodeSocketFloat", "Blender_Game_Scale") + _nodeFogNear: NodeSocketInt = new_group.outputs.new("NodeSocketInt", "FogNear") + _nodeFogFar: NodeSocketInt = new_group.outputs.new("NodeSocketInt", "FogFar") + _nodeShadeColor: NodeSocketColor = new_group.outputs.new("NodeSocketColor", "ShadeColor") + _nodeAmbientColor: NodeSocketColor = new_group.outputs.new("NodeSocketColor", "AmbientColor") + _nodeLightDirection: NodeSocketVectorDirection = new_group.outputs.new( + "NodeSocketVectorDirection", "LightDirection" + ) # Set outputs from render settings sceneOutputs: NodeGroupOutput = new_group.nodes["Group Output"] From 129124e275bf9b516e5568b355fd1ffafe1b82fe Mon Sep 17 00:00:00 2001 From: kurethedead Date: Wed, 15 Nov 2023 16:32:44 -0800 Subject: [PATCH 45/74] Fixed bone groups for sm64 geolayouts --- fast64_internal/sm64/sm64_geolayout_bone.py | 13 +++- fast64_internal/sm64/sm64_geolayout_parser.py | 76 ++++++++++++++----- .../sm64/sm64_geolayout_utility.py | 41 +++++++--- fast64_internal/sm64/sm64_geolayout_writer.py | 3 +- 4 files changed, 102 insertions(+), 31 deletions(-) diff --git a/fast64_internal/sm64/sm64_geolayout_bone.py b/fast64_internal/sm64/sm64_geolayout_bone.py index 20b9d6c..5b12c5d 100644 --- a/fast64_internal/sm64/sm64_geolayout_bone.py +++ b/fast64_internal/sm64/sm64_geolayout_bone.py @@ -1,3 +1,4 @@ +import bpy from bpy.ops import object from bpy.types import Bone, Object, Panel, Operator, Armature, Mesh, Material, PropertyGroup from bpy.utils import register_class, unregister_class @@ -81,7 +82,6 @@ enumMatOverrideOptions = [ def drawGeoInfo(panel: Panel, bone: Bone): - panel.layout.box().label(text="Geolayout Inspector") if bone is None: panel.layout.label(text="Edit geolayout properties in Pose mode.") @@ -427,9 +427,14 @@ class GeolayoutBoneSidePanel(Panel): def getSwitchOptionBone(switchArmature): optionBones = [] - for poseBone in switchArmature.pose.bones: - if poseBone.bone_group is not None and poseBone.bone_group.name == "SwitchOption": - optionBones.append(poseBone.name) + if bpy.app.version >= (4, 0, 0): + for bone in switchArmature.data.bones: + if bone.name in switchArmature.data.collections["SwitchOption"].bones: + optionBones.append(bone.name) + else: + for poseBone in switchArmature.pose.bones: + if poseBone.bone_group is not None and poseBone.bone_group.name == "SwitchOption": + optionBones.append(poseBone.name) if len(optionBones) > 1: raise PluginError("There should only be one switch option bone in " + switchArmature.name + ".") elif len(optionBones) < 1: diff --git a/fast64_internal/sm64/sm64_geolayout_parser.py b/fast64_internal/sm64/sm64_geolayout_parser.py index 555007c..2cfd162 100644 --- a/fast64_internal/sm64/sm64_geolayout_parser.py +++ b/fast64_internal/sm64/sm64_geolayout_parser.py @@ -165,7 +165,7 @@ def parseGeoLayout( # bpy.ops.transform.rotate(value = math.radians(-90), orient_axis = 'X') # bpy.ops.object.transform_apply() - if useArmature: + if bpy.app.version < (4, 0, 0) and useArmature: armatureObj.data.layers[1] = True """ @@ -508,11 +508,18 @@ def parseNode( def generateMetarig(armatureObj): + armature = armatureObj.data startBones = findStartBones(armatureObj) createBoneGroups(armatureObj) for boneName in startBones: traverseArmatureForMetarig(armatureObj, boneName, None) - armatureObj.data.layers = createBoneLayerMask([boneLayers["visual"]]) + if bpy.app.version >= (4, 0, 0): + if not "visual" in armature.collections: + armature.collections.new(name="visual") + armature.collections["visual"].assign(armature.bones[boneName]) + else: + armatureObj.data.layers = createBoneLayerMask([boneLayers["visual"]]) + if bpy.context.mode != "OBJECT": bpy.ops.object.mode_set(mode="OBJECT") @@ -520,15 +527,27 @@ def generateMetarig(armatureObj): def traverseArmatureForMetarig(armatureObj, boneName, parentName): if bpy.context.mode != "OBJECT": bpy.ops.object.mode_set(mode="OBJECT") - poseBone = armatureObj.pose.bones[boneName] - if poseBone.bone_group is None: - processBoneMeta(armatureObj, boneName, parentName) - elif poseBone.bone_group.name == "Ignore": - return + armature = armatureObj.data + bone = armature.bones[boneName] poseBone = armatureObj.pose.bones[boneName] - nextParentName = boneName if poseBone.bone_group is None else parentName - childrenNames = [child.name for child in poseBone.children] + + if bpy.app.version >= (4, 0, 0): + if len(bone.collections) == 0: + processBoneMeta(armatureObj, boneName, parentName) + elif "Ignore" in bone.collections: + return + nextParentName = boneName if len(bone.collections) == 0 else parentName + childrenNames = [child.name for child in bone.children] + + else: + if poseBone.bone_group is None: + processBoneMeta(armatureObj, boneName, parentName) + elif poseBone.bone_group.name == "Ignore": + return + nextParentName = boneName if poseBone.bone_group is None else parentName + childrenNames = [child.name for child in poseBone.children] + for childName in childrenNames: traverseArmatureForMetarig(armatureObj, childName, nextParentName) @@ -536,6 +555,7 @@ def traverseArmatureForMetarig(armatureObj, boneName, parentName): def processBoneMeta(armatureObj, boneName, parentName): bpy.ops.object.mode_set(mode="EDIT") bone = armatureObj.data.edit_bones[boneName] + armature = armatureObj.data # create meta bone, which the actual bone copies the rotation of metabone = armatureObj.data.edit_bones.new("meta_" + boneName) @@ -574,16 +594,29 @@ def processBoneMeta(armatureObj, boneName, parentName): translateConstraint.target = armatureObj translateConstraint.subtarget = metaboneName - metabone.layers = createBoneLayerMask([boneLayers["meta"]]) + if bpy.app.version >= (4, 0, 0): + if not "meta" in armature.collections: + armature.collections.new(name="meta") + armature.collections["meta"].assign(metabone) + + if not "visual" in armature.collections: + armature.collections.new(name="visual") + armature.collections["visual"].assign(visualBone) + + armature.collections["Ignore"].assign(visualBone) + armature.collections["Ignore"].assign(metabone) + + else: + metabone.layers = createBoneLayerMask([boneLayers["meta"]]) + visualBone.layers = createBoneLayerMask([boneLayers["visual"]]) + + metabonePose.bone_group_index = getBoneGroupIndex(armatureObj, "Ignore") + visualBonePose.bone_group_index = getBoneGroupIndex(armatureObj, "Ignore") + metabone.use_deform = False metabonePose.lock_rotation = (True, True, True) - - visualBone.layers = createBoneLayerMask([boneLayers["visual"]]) visualBone.use_deform = False - metabonePose.bone_group_index = getBoneGroupIndex(armatureObj, "Ignore") - visualBonePose.bone_group_index = getBoneGroupIndex(armatureObj, "Ignore") - bpy.ops.object.mode_set(mode="EDIT") metabone = armatureObj.data.edit_bones[metaboneName] visualBone = armatureObj.data.edit_bones[visualBoneName] @@ -622,6 +655,7 @@ def processBoneMeta(armatureObj, boneName, parentName): def createConnectBone(armatureObj, childName, parentName): + armature = armatureObj.data child = armatureObj.data.edit_bones[childName] parent = armatureObj.data.edit_bones[parentName] @@ -643,8 +677,16 @@ def createConnectBone(armatureObj, childName, parentName): bpy.ops.object.mode_set(mode="OBJECT") connectPoseBone = armatureObj.pose.bones[connectBoneName] connectBone = armatureObj.data.bones[connectBoneName] - connectBone.layers = createBoneLayerMask([boneLayers["visual"]]) - connectPoseBone.bone_group_index = getBoneGroupIndex(armatureObj, "Ignore") + + if bpy.app.version > (4, 0, 0): + if not "visual" in armature.collections: + armature.collections.new(name="visual") + armature.collections["visual"].assign(connectBone) + armature.collections["Ignore"].assign(connectBone) + else: + connectBone.layers = createBoneLayerMask([boneLayers["visual"]]) + connectPoseBone.bone_group_index = getBoneGroupIndex(armatureObj, "Ignore") + connectPoseBone.lock_rotation = (True, True, True) bpy.ops.object.mode_set(mode="EDIT") diff --git a/fast64_internal/sm64/sm64_geolayout_utility.py b/fast64_internal/sm64/sm64_geolayout_utility.py index 752c227..f422205 100644 --- a/fast64_internal/sm64/sm64_geolayout_utility.py +++ b/fast64_internal/sm64/sm64_geolayout_utility.py @@ -55,21 +55,33 @@ def createBoneLayerMask(values): def createBoneGroups(armatureObj): - for (groupName, properties) in boneNodeProperties.items(): - if getBoneGroupByName(armatureObj, groupName) is None: - boneGroup = armatureObj.pose.bone_groups.new(name=groupName) - boneGroup.color_set = properties.theme + armature = armatureObj.data + for groupName, properties in boneNodeProperties.items(): + if bpy.app.version >= (4, 0, 0): + if groupName not in armature.collections: + boneGroup = armature.collections.new(name=groupName) + else: + if getBoneGroupByName(armatureObj, groupName) is None: + boneGroup = armatureObj.pose.bone_groups.new(name=groupName) + boneGroup.color_set = properties.theme def addBoneToGroup(armatureObj, boneName, groupName): + armature = armatureObj.data if groupName is None: if bpy.context.mode != "OBJECT": bpy.ops.object.mode_set(mode="OBJECT") posebone = armatureObj.pose.bones[boneName] - bone = armatureObj.data.bones[boneName] - posebone.bone_group = None + bone = armature.bones[boneName] bone.use_deform = True - bone.layers = createBoneLayerMask([boneLayers["anim"]]) + if bpy.app.version >= (4, 0, 0): + if not "anim" in armature.collections: + armature.collections.new(name="anim") + armature.collections["anim"].assign(bone) + else: + posebone.bone_group = None + bone.layers = createBoneLayerMask([boneLayers["anim"]]) + posebone.lock_location = (False, False, False) posebone.lock_rotation = (False, False, False) posebone.lock_scale = (False, False, False) @@ -80,13 +92,24 @@ def addBoneToGroup(armatureObj, boneName, groupName): if bpy.context.mode != "OBJECT": bpy.ops.object.mode_set(mode="OBJECT") + posebone = armatureObj.pose.bones[boneName] bone = armatureObj.data.bones[boneName] - posebone.bone_group_index = getBoneGroupIndex(armatureObj, groupName) + if bpy.app.version >= (4, 0, 0): + armature.collections[groupName].assign(bone) + else: + posebone.bone_group_index = getBoneGroupIndex(armatureObj, groupName) + if groupName != "Ignore": bone.use_deform = boneNodeProperties[groupName].deform if groupName != "DisplayList": - bone.layers = createBoneLayerMask([boneLayers["other"]]) + if bpy.app.version >= (4, 0, 0): + if not "other" in armature.collections: + armature.collections.new(name="other") + armature.collections["other"].assign(bone) + else: + bone.layers = createBoneLayerMask([boneLayers["other"]]) + if groupName != "SwitchOption": posebone.lock_location = (True, True, True) posebone.lock_rotation = (True, True, True) diff --git a/fast64_internal/sm64/sm64_geolayout_writer.py b/fast64_internal/sm64/sm64_geolayout_writer.py index e1d723c..371d1d4 100644 --- a/fast64_internal/sm64/sm64_geolayout_writer.py +++ b/fast64_internal/sm64/sm64_geolayout_writer.py @@ -1603,7 +1603,8 @@ def processBone( ): bone = armatureObj.data.bones[boneName] poseBone = armatureObj.pose.bones[boneName] - boneGroup = poseBone.bone_group + if bpy.app.version < (4, 0, 0): + boneGroup = poseBone.bone_group finalTransform = copy.deepcopy(transformMatrix) materialOverrides = copy.copy(materialOverrides) From d765608ec5d4957d3f6e13f7be5c6b85d5742809 Mon Sep 17 00:00:00 2001 From: kurethedead Date: Wed, 15 Nov 2023 16:38:47 -0800 Subject: [PATCH 46/74] Fixed shader group upgrade --- fast64_internal/f3d/f3d_material.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/fast64_internal/f3d/f3d_material.py b/fast64_internal/f3d/f3d_material.py index 0cd4c01..465d8e0 100644 --- a/fast64_internal/f3d/f3d_material.py +++ b/fast64_internal/f3d/f3d_material.py @@ -2008,8 +2008,13 @@ def createOrUpdateSceneProperties(): if upgrade_group and group: # Need to upgrade; remove old outputs - for out in group.outputs: - group.outputs.remove(out) + if bpy.app.version >= (4,0,0): + for item in group.interface.items_tree: + if item.item_type == 'SOCKET' and item.in_out == 'OUTPUT': + group.interface.remove(item) + else: + for out in group.outputs: + group.outputs.remove(out) new_group = group else: logger.info("Creating Scene Properties") From 7c8acf48ae6e7d3e2f0406b2c72447775900bddf Mon Sep 17 00:00:00 2001 From: kurethedead <59840896+kurethedead@users.noreply.github.com> Date: Sat, 18 Nov 2023 00:32:43 -0800 Subject: [PATCH 47/74] Update fast64_internal/sm64/sm64_geolayout_writer.py Co-authored-by: Dragorn421 --- fast64_internal/sm64/sm64_geolayout_writer.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/fast64_internal/sm64/sm64_geolayout_writer.py b/fast64_internal/sm64/sm64_geolayout_writer.py index 371d1d4..454b13d 100644 --- a/fast64_internal/sm64/sm64_geolayout_writer.py +++ b/fast64_internal/sm64/sm64_geolayout_writer.py @@ -1603,8 +1603,6 @@ def processBone( ): bone = armatureObj.data.bones[boneName] poseBone = armatureObj.pose.bones[boneName] - if bpy.app.version < (4, 0, 0): - boneGroup = poseBone.bone_group finalTransform = copy.deepcopy(transformMatrix) materialOverrides = copy.copy(materialOverrides) From 779629ba5ba4cbab0fbf18561279a84cbc7c8d21 Mon Sep 17 00:00:00 2001 From: kurethedead <59840896+kurethedead@users.noreply.github.com> Date: Sat, 18 Nov 2023 00:32:51 -0800 Subject: [PATCH 48/74] Update fast64_internal/sm64/sm64_geolayout_bone.py Co-authored-by: Dragorn421 --- fast64_internal/sm64/sm64_geolayout_bone.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fast64_internal/sm64/sm64_geolayout_bone.py b/fast64_internal/sm64/sm64_geolayout_bone.py index 5b12c5d..c12f964 100644 --- a/fast64_internal/sm64/sm64_geolayout_bone.py +++ b/fast64_internal/sm64/sm64_geolayout_bone.py @@ -429,7 +429,7 @@ def getSwitchOptionBone(switchArmature): optionBones = [] if bpy.app.version >= (4, 0, 0): for bone in switchArmature.data.bones: - if bone.name in switchArmature.data.collections["SwitchOption"].bones: + if "SwitchOption" in bone.collections: optionBones.append(bone.name) else: for poseBone in switchArmature.pose.bones: From d4b0291fdf1bdb52cf1a8990f206a548aafc2208 Mon Sep 17 00:00:00 2001 From: kurethedead <59840896+kurethedead@users.noreply.github.com> Date: Sat, 18 Nov 2023 00:32:59 -0800 Subject: [PATCH 49/74] Update fast64_internal/sm64/sm64_geolayout_parser.py Co-authored-by: Dragorn421 --- fast64_internal/sm64/sm64_geolayout_parser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fast64_internal/sm64/sm64_geolayout_parser.py b/fast64_internal/sm64/sm64_geolayout_parser.py index 2cfd162..c08070b 100644 --- a/fast64_internal/sm64/sm64_geolayout_parser.py +++ b/fast64_internal/sm64/sm64_geolayout_parser.py @@ -595,7 +595,7 @@ def processBoneMeta(armatureObj, boneName, parentName): translateConstraint.subtarget = metaboneName if bpy.app.version >= (4, 0, 0): - if not "meta" in armature.collections: + if "meta" not in armature.collections: armature.collections.new(name="meta") armature.collections["meta"].assign(metabone) From ed1244988485927257a63a8dec8ac38484046eb5 Mon Sep 17 00:00:00 2001 From: kurethedead Date: Sat, 18 Nov 2023 00:36:57 -0800 Subject: [PATCH 50/74] Added collection existence check --- fast64_internal/sm64/sm64_geolayout_parser.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/fast64_internal/sm64/sm64_geolayout_parser.py b/fast64_internal/sm64/sm64_geolayout_parser.py index c08070b..0b28667 100644 --- a/fast64_internal/sm64/sm64_geolayout_parser.py +++ b/fast64_internal/sm64/sm64_geolayout_parser.py @@ -603,6 +603,10 @@ def processBoneMeta(armatureObj, boneName, parentName): armature.collections.new(name="visual") armature.collections["visual"].assign(visualBone) + # Ignore collection should always be created, but check just in case + # (generateMetarig() calls createBoneGroups() before traverseArmatureForMetarig()) + if not "Ignore" in armature.collections: + armature.collections.new(name="Ignore") armature.collections["Ignore"].assign(visualBone) armature.collections["Ignore"].assign(metabone) From 75b39bebdc7277b8c0e75e2e4a7a455d05c47404 Mon Sep 17 00:00:00 2001 From: kurethedead Date: Sat, 18 Nov 2023 01:27:33 -0800 Subject: [PATCH 51/74] Fixed metarig generation for sm64 --- fast64_internal/sm64/sm64_geolayout_bone.py | 11 ++++------ fast64_internal/sm64/sm64_geolayout_parser.py | 20 ++++++++++++++----- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/fast64_internal/sm64/sm64_geolayout_bone.py b/fast64_internal/sm64/sm64_geolayout_bone.py index c12f964..57f36a0 100644 --- a/fast64_internal/sm64/sm64_geolayout_bone.py +++ b/fast64_internal/sm64/sm64_geolayout_bone.py @@ -446,18 +446,15 @@ def getSwitchOptionBone(switchArmature): return optionBones[0] -def updateBone(self, context): - if not hasattr(context, "bone"): - print("No bone in context.") - return +def updateBone(bone, context): armatureObj = context.object createBoneGroups(armatureObj) - if context.bone.geo_cmd not in animatableBoneTypes: - addBoneToGroup(armatureObj, context.bone.name, context.bone.geo_cmd) + if bone.geo_cmd not in animatableBoneTypes: + addBoneToGroup(armatureObj, bone.name, bone.geo_cmd) object.mode_set(mode="POSE") else: - addBoneToGroup(armatureObj, context.bone.name, None) + addBoneToGroup(armatureObj, bone.name, None) object.mode_set(mode="POSE") diff --git a/fast64_internal/sm64/sm64_geolayout_parser.py b/fast64_internal/sm64/sm64_geolayout_parser.py index 0b28667..c6c0d8a 100644 --- a/fast64_internal/sm64/sm64_geolayout_parser.py +++ b/fast64_internal/sm64/sm64_geolayout_parser.py @@ -4,7 +4,7 @@ from ..f3d.f3d_parser import createBlankMaterial, parseF3DBinary from ..panels import SM64_Panel, sm64GoalImport from .sm64_level_parser import parseLevelAtPointer from .sm64_constants import level_pointers, level_enums -from .sm64_geolayout_bone import enumShadowType +from .sm64_geolayout_bone import enumShadowType, animatableBoneTypes, enumBoneType from .sm64_geolayout_constants import getGeoLayoutCmdLength, nodeGroupCmds, GEO_BRANCH_STORE from ..utility import ( @@ -533,11 +533,19 @@ def traverseArmatureForMetarig(armatureObj, boneName, parentName): poseBone = armatureObj.pose.bones[boneName] if bpy.app.version >= (4, 0, 0): - if len(bone.collections) == 0: - processBoneMeta(armatureObj, boneName, parentName) - elif "Ignore" in bone.collections: + if "Ignore" in bone.collections: return - nextParentName = boneName if len(bone.collections) == 0 else parentName + isAnimatableBone = True + nonAnimatableBoneTypes = set([item[0] for item in enumBoneType]) - animatableBoneTypes + for collectionName in nonAnimatableBoneTypes: + if collectionName in bone.collections: + isAnimatableBone = False + break + print(f"{boneName}: animatable = {isAnimatableBone}, children = {[child.name for child in bone.children]}") + if isAnimatableBone: + processBoneMeta(armatureObj, boneName, parentName) + nextParentName = boneName if isAnimatableBone else parentName + bone = armature.bones[boneName] # re-obtain reference after edit mode changes childrenNames = [child.name for child in bone.children] else: @@ -545,6 +553,8 @@ def traverseArmatureForMetarig(armatureObj, boneName, parentName): processBoneMeta(armatureObj, boneName, parentName) elif poseBone.bone_group.name == "Ignore": return + + poseBone = armatureObj.pose.bones[boneName] # re-obtain reference after edit mode changes nextParentName = boneName if poseBone.bone_group is None else parentName childrenNames = [child.name for child in poseBone.children] From b48650c0f75b9d15adee567c4ca43fc32ffdcb3f Mon Sep 17 00:00:00 2001 From: kurethedead Date: Sat, 18 Nov 2023 01:31:08 -0800 Subject: [PATCH 52/74] Removed debug print --- fast64_internal/sm64/sm64_geolayout_parser.py | 1 - 1 file changed, 1 deletion(-) diff --git a/fast64_internal/sm64/sm64_geolayout_parser.py b/fast64_internal/sm64/sm64_geolayout_parser.py index c6c0d8a..0bdb7bd 100644 --- a/fast64_internal/sm64/sm64_geolayout_parser.py +++ b/fast64_internal/sm64/sm64_geolayout_parser.py @@ -541,7 +541,6 @@ def traverseArmatureForMetarig(armatureObj, boneName, parentName): if collectionName in bone.collections: isAnimatableBone = False break - print(f"{boneName}: animatable = {isAnimatableBone}, children = {[child.name for child in bone.children]}") if isAnimatableBone: processBoneMeta(armatureObj, boneName, parentName) nextParentName = boneName if isAnimatableBone else parentName From b5397f34e95baee348b01ae2ba919d0af38cf580 Mon Sep 17 00:00:00 2001 From: kurethedead Date: Sat, 18 Nov 2023 09:51:02 -0800 Subject: [PATCH 53/74] Simplified expression --- fast64_internal/sm64/sm64_geolayout_parser.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/fast64_internal/sm64/sm64_geolayout_parser.py b/fast64_internal/sm64/sm64_geolayout_parser.py index 0bdb7bd..34d1b4a 100644 --- a/fast64_internal/sm64/sm64_geolayout_parser.py +++ b/fast64_internal/sm64/sm64_geolayout_parser.py @@ -535,16 +535,12 @@ def traverseArmatureForMetarig(armatureObj, boneName, parentName): if bpy.app.version >= (4, 0, 0): if "Ignore" in bone.collections: return - isAnimatableBone = True nonAnimatableBoneTypes = set([item[0] for item in enumBoneType]) - animatableBoneTypes - for collectionName in nonAnimatableBoneTypes: - if collectionName in bone.collections: - isAnimatableBone = False - break + isAnimatableBone = not any([item in bone.collections for item in nonAnimatableBoneTypes]) if isAnimatableBone: processBoneMeta(armatureObj, boneName, parentName) nextParentName = boneName if isAnimatableBone else parentName - bone = armature.bones[boneName] # re-obtain reference after edit mode changes + bone = armature.bones[boneName] # re-obtain reference after edit mode changes childrenNames = [child.name for child in bone.children] else: @@ -552,8 +548,8 @@ def traverseArmatureForMetarig(armatureObj, boneName, parentName): processBoneMeta(armatureObj, boneName, parentName) elif poseBone.bone_group.name == "Ignore": return - - poseBone = armatureObj.pose.bones[boneName] # re-obtain reference after edit mode changes + + poseBone = armatureObj.pose.bones[boneName] # re-obtain reference after edit mode changes nextParentName = boneName if poseBone.bone_group is None else parentName childrenNames = [child.name for child in poseBone.children] From bfc32e42927f395a74ff0dfffce26f6f5b016021 Mon Sep 17 00:00:00 2001 From: Sauraen Date: Thu, 30 Nov 2023 18:50:42 -0800 Subject: [PATCH 54/74] Hotfix for Bloxifilmz --- fast64_internal/sm64/sm64_f3d_writer.py | 2 +- fast64_internal/sm64/sm64_geolayout_writer.py | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/fast64_internal/sm64/sm64_f3d_writer.py b/fast64_internal/sm64/sm64_f3d_writer.py index 8b3239c..695e0e9 100644 --- a/fast64_internal/sm64/sm64_f3d_writer.py +++ b/fast64_internal/sm64/sm64_f3d_writer.py @@ -524,7 +524,7 @@ def exportF3DtoInsertableBinary(filepath, transformMatrix, obj, includeChildren) data, startRAM = getBinaryBank0F3DData(fModel, 0, [0, 0xFFFFFF]) # must happen after getBinaryBank0F3DData - address_ptrs = fModel.get_ptr_addresses(f3dType) + address_ptrs = fModel.get_ptr_addresses(get_F3D_GBI()) writeInsertableFile(filepath, insertableBinaryTypes["Display List"], address_ptrs, fMesh.draw.startAddress, data) diff --git a/fast64_internal/sm64/sm64_geolayout_writer.py b/fast64_internal/sm64/sm64_geolayout_writer.py index 454b13d..d1981f6 100644 --- a/fast64_internal/sm64/sm64_geolayout_writer.py +++ b/fast64_internal/sm64/sm64_geolayout_writer.py @@ -802,7 +802,7 @@ def exportGeolayoutArmatureInsertableBinary(armatureObj, obj, convertTransformMa armatureObj, obj, convertTransformMatrix, camera, armatureObj.name, DLFormat.Static, True ) - saveGeolayoutInsertableBinary(geolayoutGraph, fModel, filepath, f3dType) + saveGeolayoutInsertableBinary(geolayoutGraph, fModel, filepath) def exportGeolayoutObjectInsertableBinary(obj, convertTransformMatrix, filepath, camera): @@ -810,14 +810,14 @@ def exportGeolayoutObjectInsertableBinary(obj, convertTransformMatrix, filepath, obj, convertTransformMatrix, camera, obj.name, None, None, DLFormat.Static, True ) - saveGeolayoutInsertableBinary(geolayoutGraph, fModel, filepath, f3dType) + saveGeolayoutInsertableBinary(geolayoutGraph, fModel, filepath) -def saveGeolayoutInsertableBinary(geolayoutGraph, fModel, filepath, f3d): +def saveGeolayoutInsertableBinary(geolayoutGraph, fModel, filepath): data, startRAM = getBinaryBank0GeolayoutData(fModel, geolayoutGraph, 0, [0, 0xFFFFFF]) address_ptrs = geolayoutGraph.get_ptr_addresses() - address_ptrs.extend(fModel.get_ptr_addresses(f3d)) + address_ptrs.extend(fModel.get_ptr_addresses(get_F3D_GBI())) writeInsertableFile( filepath, insertableBinaryTypes["Geolayout"], address_ptrs, geolayoutGraph.startGeolayout.startAddress, data From 1ff05b009f57a5d570d1dbf1908a480623dc75fa Mon Sep 17 00:00:00 2001 From: Sauraen Date: Thu, 30 Nov 2023 19:02:27 -0800 Subject: [PATCH 55/74] Hotfix to the hotfix --- fast64_internal/sm64/sm64_f3d_writer.py | 1 + fast64_internal/sm64/sm64_geolayout_writer.py | 1 + 2 files changed, 2 insertions(+) diff --git a/fast64_internal/sm64/sm64_f3d_writer.py b/fast64_internal/sm64/sm64_f3d_writer.py index 695e0e9..13026ec 100644 --- a/fast64_internal/sm64/sm64_f3d_writer.py +++ b/fast64_internal/sm64/sm64_f3d_writer.py @@ -16,6 +16,7 @@ from typing import Tuple, Union, Iterable from ..f3d.f3d_bleed import BleedGraphics from ..f3d.f3d_gbi import ( + get_F3D_GBI, GbiMacro, GfxTag, FMaterial, diff --git a/fast64_internal/sm64/sm64_geolayout_writer.py b/fast64_internal/sm64/sm64_geolayout_writer.py index d1981f6..bca8a6a 100644 --- a/fast64_internal/sm64/sm64_geolayout_writer.py +++ b/fast64_internal/sm64/sm64_geolayout_writer.py @@ -80,6 +80,7 @@ from ..f3d.f3d_writer import ( ) from ..f3d.f3d_gbi import ( + get_F3D_GBI, GfxList, GfxListTag, GfxMatWriteMethod, From 7ae1d05a531309dedc2721508adb2e976653dd68 Mon Sep 17 00:00:00 2001 From: Sauraen Date: Thu, 30 Nov 2023 22:12:33 -0800 Subject: [PATCH 56/74] Updated warnings about RDP silicon bugs --- fast64_internal/f3d/f3d_enums.py | 6 +++--- fast64_internal/f3d/f3d_material.py | 16 ++++++++++++++++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/fast64_internal/f3d/f3d_enums.py b/fast64_internal/f3d/f3d_enums.py index be36afd..e17f108 100644 --- a/fast64_internal/f3d/f3d_enums.py +++ b/fast64_internal/f3d/f3d_enums.py @@ -268,7 +268,7 @@ enumBlendColor = [ "Input (CC/Blender)", "First cycle: Color Combiner RGB, Second cycle: Blender numerator from first cycle", ), - ("G_BL_CLR_MEM", "Framebuffer Color", "Framebuffer Color (Memory)"), + ("G_BL_CLR_MEM", "Framebuffer Color", "Framebuffer (Memory) Color"), ("G_BL_CLR_BL", "Blend Color", "Blend Color Register"), ("G_BL_CLR_FOG", "Fog Color", "Fog Color Register"), ] @@ -276,13 +276,13 @@ enumBlendColor = [ enumBlendAlpha = [ ("G_BL_A_IN", "Color Combiner Alpha", "Color Combiner Alpha"), ("G_BL_A_FOG", "Fog Alpha", "Fog Color Register Alpha"), - ("G_BL_A_SHADE", "Shade Alpha", "Stepped Shade Alpha"), + ("G_BL_A_SHADE", "Shade Alpha", "Stepped Shade Alpha from RSP, often fog"), ("G_BL_0", "0", "0"), ] enumBlendMix = [ ("G_BL_1MA", "1 - A", "1 - A, where A is selected above"), - ("G_BL_A_MEM", "Framebuffer Alpha", "Framebuffer (Memory) Alpha"), + ("G_BL_A_MEM", "Framebuffer Alpha", "Framebuffer (Memory) Alpha (Coverage)"), ("G_BL_1", "1", "1"), ("G_BL_0", "0", "0"), ] diff --git a/fast64_internal/f3d/f3d_material.py b/fast64_internal/f3d/f3d_material.py index 6abfe76..ec295af 100644 --- a/fast64_internal/f3d/f3d_material.py +++ b/fast64_internal/f3d/f3d_material.py @@ -806,6 +806,22 @@ class F3DPanel(Panel): prop_split(renderGroup, material.rdp_settings, "alpha_cvg_sel", "Use Coverage For Alpha") prop_split(renderGroup, material.rdp_settings, "force_bl", "Force Blending") + if material.rdp_settings.g_mdsft_cycletype == "G_CYC_2CYCLE": + if ( + material.rdp_settings.blend_b1 == "G_BL_A_MEM" or + material.rdp_settings.blend_p1 == "G_BL_CLR_MEM" or + material.rdp_settings.blend_m1 == "G_BL_CLR_MEM" + ): + multilineLabel(renderGroup.box(), + "RDP silicon bug: Framebuffer color / alpha in blender\n" + + "cycle 1 is broken, actually value from PREVIOUS pixel.", + 'ORPHAN_DATA') + if material.rdp_settings.blend_a2 == "G_BL_A_SHADE": + multilineLabel(renderGroup.box(), + "RDP silicon bug: Shade alpha in blender cycle 2\n" + + "is broken, actually shade alpha from NEXT pixel.", + 'ORPHAN_DATA') + # cycle dependent - (P * A + M - B) / (A + B) combinerBox = renderGroup.box() combinerBox.label(text="Blender (Color = (P * A + M * B) / (A + B)") From 0b3bf23ae395d51635a7e1639f861bfa8e697c20 Mon Sep 17 00:00:00 2001 From: Sauraen Date: Sun, 3 Dec 2023 15:20:49 -0800 Subject: [PATCH 57/74] Updated fast64 with recent F3DEX3 changes --- fast64_internal/f3d/f3d_gbi.py | 225 ++++++++++---- fast64_internal/f3d/f3d_material.py | 112 ++++--- fast64_internal/f3d/f3d_material_presets.py | 310 ++++++++++++-------- fast64_internal/f3d/f3d_parser.py | 64 ++-- fast64_internal/f3d/f3d_writer.py | 18 +- 5 files changed, 477 insertions(+), 252 deletions(-) diff --git a/fast64_internal/f3d/f3d_gbi.py b/fast64_internal/f3d/f3d_gbi.py index c43ea86..a8af5eb 100644 --- a/fast64_internal/f3d/f3d_gbi.py +++ b/fast64_internal/f3d/f3d_gbi.py @@ -177,12 +177,9 @@ class F3D: self.G_QUAD = 0x07 if F3DEX_GBI_3: - self.G_RETURNNONEVISIBLE = 0xD4 - self.G_BOUNDINGVERTS = 0xD5 - self.G_POPBRANCHCALL = 0x08 - self.G_TRISTRIP = 0x09 - self.G_TRIFAN = 0x0A - self.G_LIGHTTORDP = 0x0B + self.G_TRISTRIP = 0x08 + self.G_TRIFAN = 0x09 + self.G_LIGHTTORDP = 0x0A else: self.G_SPECIAL_1 = 0xD5 self.G_SPECIAL_2 = 0xD4 @@ -337,12 +334,14 @@ class F3D: self.G_CLIPPING = 0x00000000 if F3DEX_GBI_3: + self.G_AMBOCCLUSION = 0x00000040 + self.G_ATTROFFSET_Z_ENABLE = 0x00000080 self.G_ATTROFFSET_ST_ENABLE = 0x00000100 - self.G_ATTROFFSET_Z_ENABLE = 0x00000800 - self.G_PACKED_NORMALS = 0x00001000 - self.G_LIGHTTOALPHA = 0x00002000 - self.G_AMBOCCLUSION = 0x00004000 - self.G_FRESNEL = 0x00008000 + self.G_PACKED_NORMALS = 0x00000800 + self.G_LIGHTTOALPHA = 0x00001000 + self.G_LIGHTING_SPECULAR = 0x00002000 + self.G_FRESNEL_COLOR = 0x00004000 + self.G_FRESNEL_ALPHA = 0x00008000 self.G_LIGHTING_POSITIONAL = 0x00400000 # Ignored, always on self.allGeomModeFlags = { @@ -363,12 +362,14 @@ class F3D: } if F3DEX_GBI_3: self.allGeomModeFlags |= { - "G_ATTROFFSET_ST_ENABLE", + "G_AMBOCCLUSION", "G_ATTROFFSET_Z_ENABLE", + "G_ATTROFFSET_ST_ENABLE", "G_PACKED_NORMALS", "G_LIGHTTOALPHA", - "G_AMBOCCLUSION", - "G_FRESNEL", + "G_LIGHTING_SPECULAR", + "G_FRESNEL_COLOR", + "G_FRESNEL_ALPHA", } self.G_FOG_H = self.G_FOG / 0x10000 @@ -1431,9 +1432,6 @@ class F3D: self.G_ALPHA_COMPARE_CULL_BELOW = 1 self.G_ALPHA_COMPARE_CULL_ABOVE = -1 - self.G_BOUNDINGVERTS_REPLACE = 0 - self.G_BOUNDINGVERTS_PUSH = -1 - # Some structs here self.G_MAXZ = 0x03FF # 10 bits of integer screen-Z precision @@ -1498,9 +1496,7 @@ class F3D: else: self.G_MW_MATRIX = 0x00 # NOTE: also used by movemem self.G_MW_NUMLIGHT = 0x02 - if F3DEX_GBI_3: - self.G_MW_PERSPNORM = 0x04 - else: + if not F3DEX_GBI_3: self.G_MW_CLIP = 0x04 self.G_MW_SEGMENT = 0x06 self.G_MW_FOG = 0x08 @@ -1512,6 +1508,9 @@ class F3D: self.G_MW_POINTS = 0x0C self.G_MW_PERSPNORM = 0x0E + if F3DEX_GBI_3: + self.G_MW_HALFWORD_FLAG = 0x8000 + # These are offsets from the address in the dmem table self.G_MWO_NUMLIGHT = 0x00 @@ -1613,13 +1612,17 @@ class F3D: self.G_MWO_POINT_ZSCREEN = 0x1C if F3DEX_GBI_3: - self.G_MWO_AMB_OCCLUSION = 0x00 - self.G_MWO_FRESNEL = 0x04 - self.G_MWO_ATTR_OFFSET_ST = 0x08 - self.G_MWO_ATTR_OFFSET_Z = 0x0C - self.G_MWO_NORMALS_MODE = 0x0E - self.G_MWO_ALPHA_COMPARE_CULL = 0x12 - self.G_MWO_BOUNDING_FLAGS = 0x18 + self.G_MWO_AO_AMBIENT = 0x00 + self.G_MWO_AO_DIRECTIONAL = 0x02 + self.G_MWO_AO_POINT = 0x04 + self.G_MWO_PERSPNORM = 0x06 + self.G_MWO_FRESNEL_SCALE = 0x0C + self.G_MWO_FRESNEL_OFFSET = 0x0E + self.G_MWO_ATTR_OFFSET_S = 0x10 + self.G_MWO_ATTR_OFFSET_T = 0x12 + self.G_MWO_ATTR_OFFSET_Z = 0x14 + self.G_MWO_ALPHA_COMPARE_CULL = 0x16 + self.G_MWO_NORMALS_MODE = 0x18 # Texturing macros @@ -1766,10 +1769,10 @@ def _SHIFTL(value, amount, mask): MTX_SIZE = 64 VTX_SIZE = 16 GFX_SIZE = 8 -VP_SIZE = 8 -LIGHT_SIZE = 16 # 12, but padded to 64bit alignment +VP_SIZE = 16 # it's 16 bytes but vanilla GBI has only one s64 for alignment, not two +LIGHT_SIZE = 16 AMBIENT_SIZE = 8 -HILITE_SIZE = 16 +HILITE_SIZE = 16 # 8 in F3DEX3, but this variable is not used in fast64 class ExportCData: @@ -3524,12 +3527,20 @@ def gsImmp21(c, p0, p1, dat): def gsMoveWd(index, offset, data, f3d): + if f3d.F3DEX_GBI_3: + offset &= 0xFFF if f3d.F3DEX_GBI_2: return gsDma1p(f3d.G_MOVEWORD, data, offset, index) else: return gsImmp21(f3d.G_MOVEWORD, offset, index, data) +def gsMoveHalfwd(index, offset, data, f3d): + if not f3d.F3DEX_GBI_3: + raise PluginError("gsMoveHalfwd requires F3DEX3 microcode") + return gsDma1p(f3d.G_MOVEWORD, data, (offset & 0xFFF) | f3d.G_MW_HALFWORD_FLAG, index) + + # SPSprite2DScaleFlip # SPSprite2DDraw @@ -3721,30 +3732,117 @@ class SPClipRatio(GbiMacro): @dataclass(unsafe_hash=True) -class SPAmbOcclusion(GbiMacro): +class SPAmbOcclusionAmb(GbiMacro): + amb: int + _hex = 4 + + def to_binary(self, f3d, segments): + if not f3d.F3DEX_GBI_3: + raise PluginError("SPAmbOcclusionAmb requires F3DEX3 microcode") + return gsMoveHalfwd(f3d.G_MW_FX, f3d.G_MWO_AO_AMBIENT, self.amb, f3d) + + +@dataclass(unsafe_hash=True) +class SPAmbOcclusionDir(GbiMacro): + dir: int + _hex = 4 + + def to_binary(self, f3d, segments): + if not f3d.F3DEX_GBI_3: + raise PluginError("SPAmbOcclusionDir requires F3DEX3 microcode") + return gsMoveHalfwd(f3d.G_MW_FX, f3d.G_MWO_AO_DIRECTIONAL, self.dir, f3d) + + +@dataclass(unsafe_hash=True) +class SPAmbOcclusionPoint(GbiMacro): + point: int + _hex = 4 + + def to_binary(self, f3d, segments): + if not f3d.F3DEX_GBI_3: + raise PluginError("SPAmbOcclusionPoint requires F3DEX3 microcode") + return gsMoveHalfwd(f3d.G_MW_FX, f3d.G_MWO_AO_POINT, self.point, f3d) + + +@dataclass(unsafe_hash=True) +class SPAmbOcclusionAmbDir(GbiMacro): amb: int dir: int _hex = 4 def to_binary(self, f3d, segments): if not f3d.F3DEX_GBI_3: - raise PluginError("SPAmbOcclusion requires F3DEX3 microcode") + raise PluginError("SPAmbOcclusionAmbDir requires F3DEX3 microcode") return gsMoveWd( - f3d.G_MW_FX, f3d.G_MWO_AMB_OCCLUSION, (_SHIFTL(self.amb, 16, 16) | _SHIFTL(self.dir, 0, 16)), f3d + f3d.G_MW_FX, f3d.G_MWO_AO_AMBIENT, (_SHIFTL(self.amb, 16, 16) | _SHIFTL(self.dir, 0, 16)), f3d + ) + + +@dataclass(unsafe_hash=True) +class SPAmbOcclusionDirPoint(GbiMacro): + dir: int + point: int + _hex = 4 + + def to_binary(self, f3d, segments): + if not f3d.F3DEX_GBI_3: + raise PluginError("SPAmbOcclusionDirPoint requires F3DEX3 microcode") + return gsMoveWd( + f3d.G_MW_FX, f3d.G_MWO_AO_DIRECTIONAL, (_SHIFTL(self.dir, 16, 16) | _SHIFTL(self.point, 0, 16)), f3d + ) + + +@dataclass(unsafe_hash=True) +class SPAmbOcclusion(GbiMacro): + amb: int + dir: int + point: int + _hex = 4 + + def to_binary(self, f3d, segments): + if not f3d.F3DEX_GBI_3: + raise PluginError("SPAmbOcclusion requires F3DEX3 microcode") + return SPAmbOcclusionAmbDir(self.amb, self.dir).to_binary(f3d, segments) + \ + SPAmbOcclusionPoint(self.point).to_binary(f3d, segments) + + +@dataclass(unsafe_hash=True) +class SPFresnelScale(GbiMacro): + scale: int + _hex = 4 + + def to_binary(self, f3d, segments): + if not f3d.F3DEX_GBI_3: + raise PluginError("SPFresnelScale requires F3DEX3 microcode") + return gsMoveHalfwd( + f3d.G_MW_FX, f3d.G_MWO_FRESNEL_SCALE, self.scale, f3d + ) + + +@dataclass(unsafe_hash=True) +class SPFresnelOffset(GbiMacro): + offset: int + _hex = 4 + + def to_binary(self, f3d, segments): + if not f3d.F3DEX_GBI_3: + raise PluginError("SPFresnelOffset requires F3DEX3 microcode") + return gsMoveHalfwd( + f3d.G_MW_FX, f3d.G_MWO_FRESNEL_OFFSET, self.offset, f3d ) @dataclass(unsafe_hash=True) class SPFresnel(GbiMacro): - offset: int scale: int + offset: int _hex = 4 def to_binary(self, f3d, segments): if not f3d.F3DEX_GBI_3: raise PluginError("SPFresnel requires F3DEX3 microcode") return gsMoveWd( - f3d.G_MW_FX, f3d.G_MWO_FRESNEL, (_SHIFTL(self.offset, 16, 16) | _SHIFTL(self.scale, 0, 16)), f3d + f3d.G_MW_FX, f3d.G_MWO_FRESNEL_SCALE, (_SHIFTL(self.scale, 16, 16) | _SHIFTL(self.offset, 0, 16)), f3d ) @@ -3757,7 +3855,7 @@ class SPAttrOffsetST(GbiMacro): def to_binary(self, f3d, segments): if not f3d.F3DEX_GBI_3: raise PluginError("SPAttrOffsetST requires F3DEX3 microcode") - return gsMoveWd(f3d.G_MW_FX, f3d.G_MWO_ATTR_OFFSET_ST, (_SHIFTL(self.s, 16, 16) | _SHIFTL(self.t, 0, 16)), f3d) + return gsMoveWd(f3d.G_MW_FX, f3d.G_MWO_ATTR_OFFSET_S, (_SHIFTL(self.s, 16, 16) | _SHIFTL(self.t, 0, 16)), f3d) @dataclass(unsafe_hash=True) @@ -3771,25 +3869,6 @@ class SPAttrOffsetZ(GbiMacro): return gsMoveWd(f3d.G_MW_FX, f3d.G_MWO_ATTR_OFFSET_Z, (_SHIFTL(self.z, 16, 16)), f3d) -@dataclass(unsafe_hash=True) -class SPNormalsMode(GbiMacro): - mode: str - - def to_binary(self, f3d, segments): - if not f3d.F3DEX_GBI_3: - raise PluginError("SPNormalsMode requires F3DEX3 microcode") - if self.mode == "G_NORMALS_MODE_FAST": - modeVal = f3d.G_NORMALS_MODE_FAST - elif self.mode == "G_NORMALS_MODE_AUTO": - modeVal = f3d.G_NORMALS_MODE_AUTO - elif self.mode == "G_NORMALS_MODE_MANUAL": - modeVal = f3d.G_NORMALS_MODE_MANUAL - return gsMoveWd(f3d.G_MW_FX, f3d.G_MWO_NORMALS_MODE, modeVal, f3d) - - -# F3DEX3 TODO: SPMITMatrix - - @dataclass(unsafe_hash=True) class SPAlphaCompareCull(GbiMacro): mode: str @@ -3804,11 +3883,30 @@ class SPAlphaCompareCull(GbiMacro): modeVal = f3d.G_ALPHA_COMPARE_CULL_BELOW elif self.mode == "G_ALPHA_COMPARE_CULL_ABOVE": modeVal = f3d.G_ALPHA_COMPARE_CULL_ABOVE - return gsMoveWd( - f3d.G_MW_FX, f3d.G_MWO_ALPHA_COMPARE_CULL, (_SHIFTL(modeVal, 24, 8) | _SHIFTL(self.thresh, 16, 8)), f3d + return gsMoveHalfwd( + f3d.G_MW_FX, f3d.G_MWO_ALPHA_COMPARE_CULL, (_SHIFTL(modeVal, 8, 8) | _SHIFTL(self.thresh, 0, 8)), f3d ) +@dataclass(unsafe_hash=True) +class SPNormalsMode(GbiMacro): + mode: str + + def to_binary(self, f3d, segments): + if not f3d.F3DEX_GBI_3: + raise PluginError("SPNormalsMode requires F3DEX3 microcode") + if self.mode == "G_NORMALS_MODE_FAST": + modeVal = f3d.G_NORMALS_MODE_FAST + elif self.mode == "G_NORMALS_MODE_AUTO": + modeVal = f3d.G_NORMALS_MODE_AUTO + elif self.mode == "G_NORMALS_MODE_MANUAL": + modeVal = f3d.G_NORMALS_MODE_MANUAL + return gsMoveHalfwd(f3d.G_MW_FX, f3d.G_MWO_NORMALS_MODE, modeVal & 0xFF, f3d) + + +# SPMITMatrix (F3DEX3) + + @dataclass(unsafe_hash=True) class SPModifyVertex(GbiMacro): vtx: int @@ -3856,9 +3954,6 @@ class SPBranchLessZraw(GbiMacro): return GFX_SIZE * 2 -# F3DEX3 TODO: SPWFarThreshold, SPBoundingVerts, SPReturnNoneVisible, -# SPPopBranchNotVisible, SPPopCallVisible, SPLoadBoundingFlags - # SPLoadUcode (RSP) # SPDma_io @@ -3916,7 +4011,7 @@ class SPLightColor(GbiMacro): col: int def to_binary(self, f3d, segments): - return gsMoveWd(f3d.G_MW_LIGHTCOL, f3d.getLightMWO_a(self.n), self.col, f3d), +gsMoveWd( + return gsMoveWd(f3d.G_MW_LIGHTCOL, f3d.getLightMWO_a(self.n), self.col, f3d) + gsMoveWd( f3d.G_MW_LIGHTCOL, f3d.getLightMWO_b(self.n), self.col, f3d ) @@ -4109,7 +4204,10 @@ class SPPerspNormalize(GbiMacro): s: int def to_binary(self, f3d, segments): - return gsMoveWd(f3d.G_MW_PERSPNORM, 0, (self.s), f3d) + if f3d.F3DEX_GBI_3: + return gsMoveHalfwd(f3d.G_MW_FX, G_MWO_PERSPNORM, (self.s), f3d) + else: + return gsMoveWd(f3d.G_MW_PERSPNORM, 0, (self.s), f3d) # SPPopMatrixN @@ -4790,9 +4888,6 @@ class DPSetTile(GbiMacro): return self.tile == f3d.G_TX_LOADTILE -# F3DEX3 TODO: DPLoadBlockTag and putting tag values in DPLoadBlock - - @dataclass(unsafe_hash=True) class DPLoadBlock(GbiMacro): tile: int diff --git a/fast64_internal/f3d/f3d_material.py b/fast64_internal/f3d/f3d_material.py index ec295af..2143782 100644 --- a/fast64_internal/f3d/f3d_material.py +++ b/fast64_internal/f3d/f3d_material.py @@ -380,10 +380,12 @@ def all_combiner_uses(f3d_mat: "F3DMaterialProperty") -> dict[str, bool]: f3d_mat, ["ENVIRONMENT", "ENV_ALPHA"] ), "Shade": combiner_uses( - f3d_mat, ["SHADE", "SHADE_ALPHA"] + f3d_mat, ["SHADE"], checkAlpha = False ), "Shade Alpha": combiner_uses( f3d_mat, ["SHADE"], checkColor = False + ) or combiner_uses( + f3d_mat, ["SHADE_ALPHA"], checkAlpha = False ), "Key": combiner_uses(f3d_mat, ["CENTER", "SCALE"]), "LOD Fraction": combiner_uses( @@ -442,15 +444,30 @@ def ui_geo_mode(settings, dataHolder, layout, useDropdown): c.label(text="Shade not used in CC, can disable lighting.", icon="INFO") if isF3DEX3: c.prop(settings, "g_packed_normals") + c.prop(settings, "g_lighting_specular") c.prop(settings, "g_ambocclusion") d = indentGroup(c, "g_tex_gen", False) if d is not None: d.prop(settings, "g_tex_gen_linear") + if lightFxPrereq and settings.g_fresnel_color: + shadeColorLabel = "Fresnel" + elif not settings.g_lighting or (lightFxPrereq and settings.g_lighttoalpha): + shadeColorLabel = "Vertex color" + elif lightFxPrereq and settings.g_packed_normals and not settings.g_lighttoalpha: + shadeColorLabel = "Lighting * vertex color" + else: + shadeColorLabel = "Lighting" + if lightFxPrereq: + c = indentGroup(inputGroup, f"Shade color = {shadeColorLabel}:", True) + c.prop(settings, "g_fresnel_color") + else: + inputGroup.column().label(text = f"Shade color = {shadeColorLabel}") + shadowMapInShadeAlpha = False if settings.g_fog: shadeAlphaLabel = "Fog" - elif lightFxPrereq and settings.g_fresnel: + elif lightFxPrereq and settings.g_fresnel_alpha: shadeAlphaLabel = "Fresnel" elif lightFxPrereq and settings.g_lighttoalpha: shadeAlphaLabel = "Light intensity" @@ -462,19 +479,18 @@ def ui_geo_mode(settings, dataHolder, layout, useDropdown): c = indentGroup(inputGroup, f"Shade alpha = {shadeAlphaLabel}:", True) if lightFxPrereq: c.prop(settings, "g_lighttoalpha") - c.prop(settings, "g_fresnel") + c.prop(settings, "g_fresnel_alpha") c.prop(settings, "g_fog") - - if lightFxPrereq and settings.g_fog and settings.g_fresnel: - c.label(text="Fog overrides Fresnel.", icon="ERROR") - elif lightFxPrereq and settings.g_fog and settings.g_lighttoalpha: + if lightFxPrereq and settings.g_fog and settings.g_fresnel_alpha: + c.label(text="Fog overrides Fresnel Alpha.", icon="ERROR") + if lightFxPrereq and settings.g_fog and settings.g_lighttoalpha: c.label(text="Fog overrides Light-to-Alpha.", icon="ERROR") - elif lightFxPrereq and settings.g_fresnel and settings.g_lighttoalpha: - c.label(text="Fresnel overrides Light-to-Alpha.", icon="ERROR") + if lightFxPrereq and settings.g_fresnel_alpha and settings.g_lighttoalpha: + c.label(text="Fresnel Alpha overrides Light-to-Alpha.", icon="ERROR") if shadowMapInShadeAlpha and ccUse["Shade Alpha"]: - c.label(text="Shadow map = shade alpha used in CC.", icon="INFO") + c.label(text="Shadow map = shade alpha used in CC, probably wrong.", icon="INFO") if settings.g_fog and ccUse["Shade Alpha"]: - c.label(text="Fog = shade alpha used in CC.", icon="INFO") + c.label(text="Fog = shade alpha used in CC, probably wrong.", icon="INFO") if blendWarnings and shadeInBlender and not settings.g_fog: c.label(text="Rendermode uses shade alpha, probably fog.", icon="INFO") elif blendWarnings and not shadeInBlender and settings.g_fog: @@ -869,8 +885,9 @@ class F3DPanel(Panel): if f3dMat.set_ao: prop_split(inputGroup.row(), f3dMat, "ao_ambient", "AO Ambient") prop_split(inputGroup.row(), f3dMat, "ao_directional", "AO Directional") + prop_split(inputGroup.row(), f3dMat, "ao_point", "AO Point") - if f3dMat.rdp_settings.g_fresnel: + if f3dMat.rdp_settings.g_fresnel_color or f3dMat.rdp_settings.g_fresnel_alpha: if showCheckBox or f3dMat.set_fresnel: inputGroup = inputCol.column() if showCheckBox: @@ -1004,10 +1021,11 @@ class F3DPanel(Panel): g_packed_normals = lightFxPrereq and settings.g_packed_normals g_ambocclusion = lightFxPrereq and settings.g_ambocclusion g_lighttoalpha = lightFxPrereq and settings.g_lighttoalpha - g_fresnel = lightFxPrereq and settings.g_fresnel + g_fresnel_color = lightFxPrereq and settings.g_fresnel_color + g_fresnel_alpha = lightFxPrereq and settings.g_fresnel_alpha - usesVertexColor = useDict["Shade"] and (not g_lighting or g_packed_normals) - usesVertexAlpha = anyUseShadeAlpha and (g_ambocclusion or not (g_fog or g_lighttoalpha or g_fresnel)) + usesVertexColor = useDict["Shade"] and (not g_lighting or (g_packed_normals and not g_fresnel_color)) + usesVertexAlpha = anyUseShadeAlpha and (g_ambocclusion or not (g_fog or g_lighttoalpha or g_fresnel_alpha)) if not usesVertexColor and not usesVertexAlpha: return noticeBox = layout.box().column() @@ -2821,6 +2839,24 @@ class RDPSettings(PropertyGroup): update=update_node_values_with_preset, description="Computes shade coordinates for primitives. Disable if not using lighting, vertex colors or fog", ) + g_ambocclusion: bpy.props.BoolProperty( + name="Ambient Occlusion", + default=False, + update=update_node_values_with_preset, + description="F3DEX3: Scales each type light intensity differently with vertex alpha. Bake scene shadows / AO into vertex alpha, not vertex color", + ) + g_attroffset_z_enable: bpy.props.BoolProperty( + name="Z Offset (for decal fix)", + default=False, + update=update_node_values_with_preset, + description="F3DEX3: Enables offset to vertex Z. To fix decals, set the Z mode to opaque and enable this", + ) + g_attroffset_st_enable: bpy.props.BoolProperty( + name="ST Offset (for UV scroll)", + default=False, + update=update_node_values_with_preset, + description="F3DEX3: Enables offsets to vertex ST values, usually for UV scrolling", + ) # v1/2 difference g_cull_front: bpy.props.BoolProperty( name="Cull Front", @@ -2835,18 +2871,6 @@ class RDPSettings(PropertyGroup): update=update_node_values_with_preset, description="Disables drawing of back faces", ) - g_attroffset_st_enable: bpy.props.BoolProperty( - name="ST Offset (for UV scroll)", - default=False, - update=update_node_values_with_preset, - description="F3DEX3: Enables offsets to vertex ST values, usually for UV scrolling", - ) - g_attroffset_z_enable: bpy.props.BoolProperty( - name="Z Offset (for decal fix)", - default=False, - update=update_node_values_with_preset, - description="F3DEX3: Enables offset to vertex Z. To fix decals, set the Z mode to opaque and enable this", - ) g_packed_normals: bpy.props.BoolProperty( name="Packed Normals (Vtx Colors + Lighting)", default=False, @@ -2859,14 +2883,20 @@ class RDPSettings(PropertyGroup): update=update_node_values_with_preset, description="F3DEX3: Moves light intensity to shade alpha, used for cel shading and other effects", ) - g_ambocclusion: bpy.props.BoolProperty( - name="Ambient Occlusion", + g_lighting_specular: bpy.props.BoolProperty( + name="Specular Lighting", default=False, update=update_node_values_with_preset, - description="F3DEX3: Scales ambient and/or directional light intensity with vertex alpha. Bake scene shadows / AO into vertex alpha, not vertex color", + description="F3DEX3: Microcode lighting computes specular instead of diffuse component. If using, must set light size field in code", ) - g_fresnel: bpy.props.BoolProperty( - name="Fresnel", + g_fresnel_color: bpy.props.BoolProperty( + name="Fresnel to Color", + default=False, + update=update_node_values_with_preset, + description="F3DEX3: Shade color derived from how much each vertex normal faces the camera. For bump mapping", + ) + g_fresnel_alpha: bpy.props.BoolProperty( + name="Fresnel to Alpha", default=False, update=update_node_values_with_preset, description="F3DEX3: Shade alpha derived from how much each vertex normal faces the camera. For water and toon outlines", @@ -3971,21 +4001,29 @@ class F3DMaterialProperty(PropertyGroup): description="How much ambient occlusion (vertex alpha) affects directional light intensity", update=update_node_values_without_preset, ) + ao_point: bpy.props.FloatProperty( + name="AO Point", + min=0.0, + max=1.0, + default=0.0, + description="How much ambient occlusion (vertex alpha) affects point light intensity", + update=update_node_values_without_preset, + ) set_ao: bpy.props.BoolProperty(update=update_node_values_without_preset) # Fresnel fresnel_lo: bpy.props.FloatProperty( name="Fresnel lo", - min=0.0, - max=1.0, + min=-1000.0, + max=1000.0, default=0.7, description="Dot product value which gives shade alpha = 0. The dot product ranges from 1 when the normal points directly at the camera, to 0 when it points sideways", update=update_node_values_without_preset, ) fresnel_hi: bpy.props.FloatProperty( name="Fresnel hi", - min=0.0, - max=1.0, + min=-1000.0, + max=1000.0, default=0.4, description="Dot product value which gives shade alpha = FF. The dot product ranges from 1 when the normal points directly at the camera, to 0 when it points sideways", update=update_node_values_without_preset, @@ -4100,7 +4138,7 @@ class F3DMaterialProperty(PropertyGroup): round(self.k5, 4) if self.set_k0_5 else None, self.combiner1.key() if self.set_combiner else None, self.combiner2.key() if self.set_combiner else None, - tuple([round(value, 4) for value in (self.ao_ambient, self.ao_directional)]) if self.set_ao else None, + tuple([round(value, 4) for value in (self.ao_ambient, self.ao_directional, self.ao_point)]) if self.set_ao else None, tuple([round(value, 4) for value in (self.fresnel_lo, self.fresnel_hi)]) if self.set_fresnel else None, tuple([round(value, 4) for value in self.attroffs_st]) if self.set_attroffs_st else None, self.attroffs_z if self.set_attroffs_z else None, diff --git a/fast64_internal/f3d/f3d_material_presets.py b/fast64_internal/f3d/f3d_material_presets.py index 30a1d22..75ddd80 100644 --- a/fast64_internal/f3d/f3d_material_presets.py +++ b/fast64_internal/f3d/f3d_material_presets.py @@ -68,14 +68,16 @@ f3d_mat.use_global_fog = True f3d_mat.rdp_settings.name = '' f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = True -f3d_mat.rdp_settings.g_attroffset_st_enable = False -f3d_mat.rdp_settings.g_attroffset_z_enable = False f3d_mat.rdp_settings.g_packed_normals = False f3d_mat.rdp_settings.g_lighttoalpha = False -f3d_mat.rdp_settings.g_ambocclusion = False -f3d_mat.rdp_settings.g_fresnel = False +f3d_mat.rdp_settings.g_lighting_specular = False +f3d_mat.rdp_settings.g_fresnel_color = False +f3d_mat.rdp_settings.g_fresnel_alpha = False f3d_mat.rdp_settings.g_fog = True f3d_mat.rdp_settings.g_lighting = True f3d_mat.rdp_settings.g_tex_gen = True @@ -197,14 +199,16 @@ f3d_mat.use_global_fog = True f3d_mat.rdp_settings.name = '' f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = False -f3d_mat.rdp_settings.g_attroffset_st_enable = False -f3d_mat.rdp_settings.g_attroffset_z_enable = False f3d_mat.rdp_settings.g_packed_normals = False f3d_mat.rdp_settings.g_lighttoalpha = False -f3d_mat.rdp_settings.g_ambocclusion = False -f3d_mat.rdp_settings.g_fresnel = False +f3d_mat.rdp_settings.g_lighting_specular = False +f3d_mat.rdp_settings.g_fresnel_color = False +f3d_mat.rdp_settings.g_fresnel_alpha = False f3d_mat.rdp_settings.g_fog = True f3d_mat.rdp_settings.g_lighting = True f3d_mat.rdp_settings.g_tex_gen = True @@ -326,14 +330,16 @@ f3d_mat.use_global_fog = True f3d_mat.rdp_settings.name = '' f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = True -f3d_mat.rdp_settings.g_attroffset_st_enable = False -f3d_mat.rdp_settings.g_attroffset_z_enable = False f3d_mat.rdp_settings.g_packed_normals = False f3d_mat.rdp_settings.g_lighttoalpha = False -f3d_mat.rdp_settings.g_ambocclusion = False -f3d_mat.rdp_settings.g_fresnel = False +f3d_mat.rdp_settings.g_lighting_specular = False +f3d_mat.rdp_settings.g_fresnel_color = False +f3d_mat.rdp_settings.g_fresnel_alpha = False f3d_mat.rdp_settings.g_fog = True f3d_mat.rdp_settings.g_lighting = True f3d_mat.rdp_settings.g_tex_gen = False @@ -455,14 +461,16 @@ f3d_mat.use_global_fog = True f3d_mat.rdp_settings.name = '' f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = False -f3d_mat.rdp_settings.g_attroffset_st_enable = False -f3d_mat.rdp_settings.g_attroffset_z_enable = False f3d_mat.rdp_settings.g_packed_normals = False f3d_mat.rdp_settings.g_lighttoalpha = False -f3d_mat.rdp_settings.g_ambocclusion = False -f3d_mat.rdp_settings.g_fresnel = False +f3d_mat.rdp_settings.g_lighting_specular = False +f3d_mat.rdp_settings.g_fresnel_color = False +f3d_mat.rdp_settings.g_fresnel_alpha = False f3d_mat.rdp_settings.g_fog = True f3d_mat.rdp_settings.g_lighting = True f3d_mat.rdp_settings.g_tex_gen = False @@ -584,14 +592,16 @@ f3d_mat.use_global_fog = True f3d_mat.rdp_settings.name = '' f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = True -f3d_mat.rdp_settings.g_attroffset_st_enable = False -f3d_mat.rdp_settings.g_attroffset_z_enable = False f3d_mat.rdp_settings.g_packed_normals = False f3d_mat.rdp_settings.g_lighttoalpha = False -f3d_mat.rdp_settings.g_ambocclusion = False -f3d_mat.rdp_settings.g_fresnel = False +f3d_mat.rdp_settings.g_lighting_specular = False +f3d_mat.rdp_settings.g_fresnel_color = False +f3d_mat.rdp_settings.g_fresnel_alpha = False f3d_mat.rdp_settings.g_fog = True f3d_mat.rdp_settings.g_lighting = True f3d_mat.rdp_settings.g_tex_gen = False @@ -713,14 +723,16 @@ f3d_mat.use_global_fog = True f3d_mat.rdp_settings.name = '' f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = False -f3d_mat.rdp_settings.g_attroffset_st_enable = False -f3d_mat.rdp_settings.g_attroffset_z_enable = False f3d_mat.rdp_settings.g_packed_normals = False f3d_mat.rdp_settings.g_lighttoalpha = False -f3d_mat.rdp_settings.g_ambocclusion = False -f3d_mat.rdp_settings.g_fresnel = False +f3d_mat.rdp_settings.g_lighting_specular = False +f3d_mat.rdp_settings.g_fresnel_color = False +f3d_mat.rdp_settings.g_fresnel_alpha = False f3d_mat.rdp_settings.g_fog = True f3d_mat.rdp_settings.g_lighting = True f3d_mat.rdp_settings.g_tex_gen = False @@ -842,14 +854,16 @@ f3d_mat.use_global_fog = True f3d_mat.rdp_settings.name = '' f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = True -f3d_mat.rdp_settings.g_attroffset_st_enable = False -f3d_mat.rdp_settings.g_attroffset_z_enable = False f3d_mat.rdp_settings.g_packed_normals = False f3d_mat.rdp_settings.g_lighttoalpha = False -f3d_mat.rdp_settings.g_ambocclusion = False -f3d_mat.rdp_settings.g_fresnel = False +f3d_mat.rdp_settings.g_lighting_specular = False +f3d_mat.rdp_settings.g_fresnel_color = False +f3d_mat.rdp_settings.g_fresnel_alpha = False f3d_mat.rdp_settings.g_fog = True f3d_mat.rdp_settings.g_lighting = True f3d_mat.rdp_settings.g_tex_gen = False @@ -971,14 +985,16 @@ f3d_mat.use_global_fog = True f3d_mat.rdp_settings.name = '' f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = False -f3d_mat.rdp_settings.g_attroffset_st_enable = False -f3d_mat.rdp_settings.g_attroffset_z_enable = False f3d_mat.rdp_settings.g_packed_normals = False f3d_mat.rdp_settings.g_lighttoalpha = False -f3d_mat.rdp_settings.g_ambocclusion = False -f3d_mat.rdp_settings.g_fresnel = False +f3d_mat.rdp_settings.g_lighting_specular = False +f3d_mat.rdp_settings.g_fresnel_color = False +f3d_mat.rdp_settings.g_fresnel_alpha = False f3d_mat.rdp_settings.g_fog = True f3d_mat.rdp_settings.g_lighting = True f3d_mat.rdp_settings.g_tex_gen = False @@ -1100,14 +1116,16 @@ f3d_mat.use_global_fog = True f3d_mat.rdp_settings.name = '' f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = False -f3d_mat.rdp_settings.g_attroffset_st_enable = False -f3d_mat.rdp_settings.g_attroffset_z_enable = False f3d_mat.rdp_settings.g_packed_normals = False f3d_mat.rdp_settings.g_lighttoalpha = False -f3d_mat.rdp_settings.g_ambocclusion = False -f3d_mat.rdp_settings.g_fresnel = False +f3d_mat.rdp_settings.g_lighting_specular = False +f3d_mat.rdp_settings.g_fresnel_color = False +f3d_mat.rdp_settings.g_fresnel_alpha = False f3d_mat.rdp_settings.g_fog = True f3d_mat.rdp_settings.g_lighting = True f3d_mat.rdp_settings.g_tex_gen = False @@ -1229,14 +1247,16 @@ f3d_mat.use_global_fog = True f3d_mat.rdp_settings.name = '' f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = True -f3d_mat.rdp_settings.g_attroffset_st_enable = False -f3d_mat.rdp_settings.g_attroffset_z_enable = False f3d_mat.rdp_settings.g_packed_normals = False f3d_mat.rdp_settings.g_lighttoalpha = False -f3d_mat.rdp_settings.g_ambocclusion = False -f3d_mat.rdp_settings.g_fresnel = False +f3d_mat.rdp_settings.g_lighting_specular = False +f3d_mat.rdp_settings.g_fresnel_color = False +f3d_mat.rdp_settings.g_fresnel_alpha = False f3d_mat.rdp_settings.g_fog = True f3d_mat.rdp_settings.g_lighting = True f3d_mat.rdp_settings.g_tex_gen = False @@ -1358,14 +1378,16 @@ f3d_mat.use_global_fog = True f3d_mat.rdp_settings.name = '' f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = False -f3d_mat.rdp_settings.g_attroffset_st_enable = False -f3d_mat.rdp_settings.g_attroffset_z_enable = False f3d_mat.rdp_settings.g_packed_normals = False f3d_mat.rdp_settings.g_lighttoalpha = False -f3d_mat.rdp_settings.g_ambocclusion = False -f3d_mat.rdp_settings.g_fresnel = False +f3d_mat.rdp_settings.g_lighting_specular = False +f3d_mat.rdp_settings.g_fresnel_color = False +f3d_mat.rdp_settings.g_fresnel_alpha = False f3d_mat.rdp_settings.g_fog = True f3d_mat.rdp_settings.g_lighting = True f3d_mat.rdp_settings.g_tex_gen = False @@ -1487,14 +1509,16 @@ f3d_mat.use_global_fog = True f3d_mat.rdp_settings.name = '' f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = False -f3d_mat.rdp_settings.g_attroffset_st_enable = False -f3d_mat.rdp_settings.g_attroffset_z_enable = False f3d_mat.rdp_settings.g_packed_normals = False f3d_mat.rdp_settings.g_lighttoalpha = False -f3d_mat.rdp_settings.g_ambocclusion = False -f3d_mat.rdp_settings.g_fresnel = False +f3d_mat.rdp_settings.g_lighting_specular = False +f3d_mat.rdp_settings.g_fresnel_color = False +f3d_mat.rdp_settings.g_fresnel_alpha = False f3d_mat.rdp_settings.g_fog = True f3d_mat.rdp_settings.g_lighting = True f3d_mat.rdp_settings.g_tex_gen = False @@ -1616,14 +1640,16 @@ f3d_mat.use_global_fog = True f3d_mat.rdp_settings.name = '' f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = True -f3d_mat.rdp_settings.g_attroffset_st_enable = False -f3d_mat.rdp_settings.g_attroffset_z_enable = False f3d_mat.rdp_settings.g_packed_normals = False f3d_mat.rdp_settings.g_lighttoalpha = False -f3d_mat.rdp_settings.g_ambocclusion = False -f3d_mat.rdp_settings.g_fresnel = False +f3d_mat.rdp_settings.g_lighting_specular = False +f3d_mat.rdp_settings.g_fresnel_color = False +f3d_mat.rdp_settings.g_fresnel_alpha = False f3d_mat.rdp_settings.g_fog = True f3d_mat.rdp_settings.g_lighting = False f3d_mat.rdp_settings.g_tex_gen = False @@ -1745,14 +1771,16 @@ f3d_mat.use_global_fog = True f3d_mat.rdp_settings.name = '' f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = False -f3d_mat.rdp_settings.g_attroffset_st_enable = False -f3d_mat.rdp_settings.g_attroffset_z_enable = False f3d_mat.rdp_settings.g_packed_normals = False f3d_mat.rdp_settings.g_lighttoalpha = False -f3d_mat.rdp_settings.g_ambocclusion = False -f3d_mat.rdp_settings.g_fresnel = False +f3d_mat.rdp_settings.g_lighting_specular = False +f3d_mat.rdp_settings.g_fresnel_color = False +f3d_mat.rdp_settings.g_fresnel_alpha = False f3d_mat.rdp_settings.g_fog = True f3d_mat.rdp_settings.g_lighting = False f3d_mat.rdp_settings.g_tex_gen = False @@ -1874,14 +1902,16 @@ f3d_mat.use_global_fog = True f3d_mat.rdp_settings.name = '' f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = False -f3d_mat.rdp_settings.g_attroffset_st_enable = False -f3d_mat.rdp_settings.g_attroffset_z_enable = False f3d_mat.rdp_settings.g_packed_normals = False f3d_mat.rdp_settings.g_lighttoalpha = False -f3d_mat.rdp_settings.g_ambocclusion = False -f3d_mat.rdp_settings.g_fresnel = False +f3d_mat.rdp_settings.g_lighting_specular = False +f3d_mat.rdp_settings.g_fresnel_color = False +f3d_mat.rdp_settings.g_fresnel_alpha = False f3d_mat.rdp_settings.g_fog = True f3d_mat.rdp_settings.g_lighting = False f3d_mat.rdp_settings.g_tex_gen = False @@ -2003,14 +2033,16 @@ f3d_mat.use_global_fog = True f3d_mat.rdp_settings.name = '' f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = True -f3d_mat.rdp_settings.g_attroffset_st_enable = False -f3d_mat.rdp_settings.g_attroffset_z_enable = False f3d_mat.rdp_settings.g_packed_normals = False f3d_mat.rdp_settings.g_lighttoalpha = False -f3d_mat.rdp_settings.g_ambocclusion = False -f3d_mat.rdp_settings.g_fresnel = False +f3d_mat.rdp_settings.g_lighting_specular = False +f3d_mat.rdp_settings.g_fresnel_color = False +f3d_mat.rdp_settings.g_fresnel_alpha = False f3d_mat.rdp_settings.g_fog = False f3d_mat.rdp_settings.g_lighting = True f3d_mat.rdp_settings.g_tex_gen = False @@ -2131,14 +2163,16 @@ f3d_mat.use_global_fog = True f3d_mat.rdp_settings.name = '' f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = True -f3d_mat.rdp_settings.g_attroffset_st_enable = False -f3d_mat.rdp_settings.g_attroffset_z_enable = False f3d_mat.rdp_settings.g_packed_normals = False f3d_mat.rdp_settings.g_lighttoalpha = False -f3d_mat.rdp_settings.g_ambocclusion = False -f3d_mat.rdp_settings.g_fresnel = False +f3d_mat.rdp_settings.g_lighting_specular = False +f3d_mat.rdp_settings.g_fresnel_color = False +f3d_mat.rdp_settings.g_fresnel_alpha = False f3d_mat.rdp_settings.g_fog = False f3d_mat.rdp_settings.g_lighting = True f3d_mat.rdp_settings.g_tex_gen = True @@ -2259,14 +2293,16 @@ f3d_mat.use_global_fog = True f3d_mat.rdp_settings.name = '' f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = True -f3d_mat.rdp_settings.g_attroffset_st_enable = False -f3d_mat.rdp_settings.g_attroffset_z_enable = False f3d_mat.rdp_settings.g_packed_normals = False f3d_mat.rdp_settings.g_lighttoalpha = False -f3d_mat.rdp_settings.g_ambocclusion = False -f3d_mat.rdp_settings.g_fresnel = False +f3d_mat.rdp_settings.g_lighting_specular = False +f3d_mat.rdp_settings.g_fresnel_color = False +f3d_mat.rdp_settings.g_fresnel_alpha = False f3d_mat.rdp_settings.g_fog = True f3d_mat.rdp_settings.g_lighting = True f3d_mat.rdp_settings.g_tex_gen = False @@ -2387,14 +2423,16 @@ f3d_mat.use_global_fog = True f3d_mat.rdp_settings.name = '' f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = False -f3d_mat.rdp_settings.g_attroffset_st_enable = False -f3d_mat.rdp_settings.g_attroffset_z_enable = False f3d_mat.rdp_settings.g_packed_normals = False f3d_mat.rdp_settings.g_lighttoalpha = False -f3d_mat.rdp_settings.g_ambocclusion = False -f3d_mat.rdp_settings.g_fresnel = False +f3d_mat.rdp_settings.g_lighting_specular = False +f3d_mat.rdp_settings.g_fresnel_color = False +f3d_mat.rdp_settings.g_fresnel_alpha = False f3d_mat.rdp_settings.g_fog = True f3d_mat.rdp_settings.g_lighting = True f3d_mat.rdp_settings.g_tex_gen = False @@ -2515,14 +2553,16 @@ f3d_mat.use_global_fog = True f3d_mat.rdp_settings.name = '' f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = False -f3d_mat.rdp_settings.g_attroffset_st_enable = False -f3d_mat.rdp_settings.g_attroffset_z_enable = False f3d_mat.rdp_settings.g_packed_normals = False f3d_mat.rdp_settings.g_lighttoalpha = False -f3d_mat.rdp_settings.g_ambocclusion = False -f3d_mat.rdp_settings.g_fresnel = False +f3d_mat.rdp_settings.g_lighting_specular = False +f3d_mat.rdp_settings.g_fresnel_color = False +f3d_mat.rdp_settings.g_fresnel_alpha = False f3d_mat.rdp_settings.g_fog = True f3d_mat.rdp_settings.g_lighting = True f3d_mat.rdp_settings.g_tex_gen = False @@ -2643,14 +2683,16 @@ f3d_mat.use_global_fog = True f3d_mat.rdp_settings.name = '' f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = True -f3d_mat.rdp_settings.g_attroffset_st_enable = False -f3d_mat.rdp_settings.g_attroffset_z_enable = False f3d_mat.rdp_settings.g_packed_normals = False f3d_mat.rdp_settings.g_lighttoalpha = False -f3d_mat.rdp_settings.g_ambocclusion = False -f3d_mat.rdp_settings.g_fresnel = False +f3d_mat.rdp_settings.g_lighting_specular = False +f3d_mat.rdp_settings.g_fresnel_color = False +f3d_mat.rdp_settings.g_fresnel_alpha = False f3d_mat.rdp_settings.g_fog = False f3d_mat.rdp_settings.g_lighting = True f3d_mat.rdp_settings.g_tex_gen = False @@ -2771,14 +2813,16 @@ f3d_mat.use_global_fog = True f3d_mat.rdp_settings.name = '' f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = True -f3d_mat.rdp_settings.g_attroffset_st_enable = False -f3d_mat.rdp_settings.g_attroffset_z_enable = False f3d_mat.rdp_settings.g_packed_normals = False f3d_mat.rdp_settings.g_lighttoalpha = False -f3d_mat.rdp_settings.g_ambocclusion = False -f3d_mat.rdp_settings.g_fresnel = False +f3d_mat.rdp_settings.g_lighting_specular = False +f3d_mat.rdp_settings.g_fresnel_color = False +f3d_mat.rdp_settings.g_fresnel_alpha = False f3d_mat.rdp_settings.g_fog = False f3d_mat.rdp_settings.g_lighting = True f3d_mat.rdp_settings.g_tex_gen = False @@ -2899,14 +2943,16 @@ f3d_mat.use_global_fog = True f3d_mat.rdp_settings.name = '' f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = True -f3d_mat.rdp_settings.g_attroffset_st_enable = False -f3d_mat.rdp_settings.g_attroffset_z_enable = False f3d_mat.rdp_settings.g_packed_normals = False f3d_mat.rdp_settings.g_lighttoalpha = False -f3d_mat.rdp_settings.g_ambocclusion = False -f3d_mat.rdp_settings.g_fresnel = False +f3d_mat.rdp_settings.g_lighting_specular = False +f3d_mat.rdp_settings.g_fresnel_color = False +f3d_mat.rdp_settings.g_fresnel_alpha = False f3d_mat.rdp_settings.g_fog = False f3d_mat.rdp_settings.g_lighting = True f3d_mat.rdp_settings.g_tex_gen = False @@ -3027,14 +3073,16 @@ f3d_mat.use_global_fog = True f3d_mat.rdp_settings.name = '' f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = False -f3d_mat.rdp_settings.g_attroffset_st_enable = False -f3d_mat.rdp_settings.g_attroffset_z_enable = False f3d_mat.rdp_settings.g_packed_normals = False f3d_mat.rdp_settings.g_lighttoalpha = False -f3d_mat.rdp_settings.g_ambocclusion = False -f3d_mat.rdp_settings.g_fresnel = False +f3d_mat.rdp_settings.g_lighting_specular = False +f3d_mat.rdp_settings.g_fresnel_color = False +f3d_mat.rdp_settings.g_fresnel_alpha = False f3d_mat.rdp_settings.g_fog = False f3d_mat.rdp_settings.g_lighting = True f3d_mat.rdp_settings.g_tex_gen = False @@ -3155,14 +3203,16 @@ f3d_mat.use_global_fog = True f3d_mat.rdp_settings.name = '' f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = False -f3d_mat.rdp_settings.g_attroffset_st_enable = False -f3d_mat.rdp_settings.g_attroffset_z_enable = False f3d_mat.rdp_settings.g_packed_normals = False f3d_mat.rdp_settings.g_lighttoalpha = False -f3d_mat.rdp_settings.g_ambocclusion = False -f3d_mat.rdp_settings.g_fresnel = False +f3d_mat.rdp_settings.g_lighting_specular = False +f3d_mat.rdp_settings.g_fresnel_color = False +f3d_mat.rdp_settings.g_fresnel_alpha = False f3d_mat.rdp_settings.g_fog = False f3d_mat.rdp_settings.g_lighting = True f3d_mat.rdp_settings.g_tex_gen = False @@ -3283,14 +3333,16 @@ f3d_mat.use_global_fog = True f3d_mat.rdp_settings.name = '' f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = True -f3d_mat.rdp_settings.g_attroffset_st_enable = False -f3d_mat.rdp_settings.g_attroffset_z_enable = False f3d_mat.rdp_settings.g_packed_normals = False f3d_mat.rdp_settings.g_lighttoalpha = False -f3d_mat.rdp_settings.g_ambocclusion = False -f3d_mat.rdp_settings.g_fresnel = False +f3d_mat.rdp_settings.g_lighting_specular = False +f3d_mat.rdp_settings.g_fresnel_color = False +f3d_mat.rdp_settings.g_fresnel_alpha = False f3d_mat.rdp_settings.g_fog = False f3d_mat.rdp_settings.g_lighting = True f3d_mat.rdp_settings.g_tex_gen = False @@ -3411,14 +3463,16 @@ f3d_mat.use_global_fog = True f3d_mat.rdp_settings.name = '' f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = False -f3d_mat.rdp_settings.g_attroffset_st_enable = False -f3d_mat.rdp_settings.g_attroffset_z_enable = False f3d_mat.rdp_settings.g_packed_normals = False f3d_mat.rdp_settings.g_lighttoalpha = False -f3d_mat.rdp_settings.g_ambocclusion = False -f3d_mat.rdp_settings.g_fresnel = False +f3d_mat.rdp_settings.g_lighting_specular = False +f3d_mat.rdp_settings.g_fresnel_color = False +f3d_mat.rdp_settings.g_fresnel_alpha = False f3d_mat.rdp_settings.g_fog = False f3d_mat.rdp_settings.g_lighting = True f3d_mat.rdp_settings.g_tex_gen = False @@ -3539,14 +3593,16 @@ f3d_mat.use_global_fog = True f3d_mat.rdp_settings.name = '' f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = True -f3d_mat.rdp_settings.g_attroffset_st_enable = False -f3d_mat.rdp_settings.g_attroffset_z_enable = False f3d_mat.rdp_settings.g_packed_normals = False f3d_mat.rdp_settings.g_lighttoalpha = False -f3d_mat.rdp_settings.g_ambocclusion = False -f3d_mat.rdp_settings.g_fresnel = False +f3d_mat.rdp_settings.g_lighting_specular = False +f3d_mat.rdp_settings.g_fresnel_color = False +f3d_mat.rdp_settings.g_fresnel_alpha = False f3d_mat.rdp_settings.g_fog = False f3d_mat.rdp_settings.g_lighting = False f3d_mat.rdp_settings.g_tex_gen = False @@ -3667,14 +3723,16 @@ f3d_mat.use_global_fog = True f3d_mat.rdp_settings.name = '' f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = True -f3d_mat.rdp_settings.g_attroffset_st_enable = False -f3d_mat.rdp_settings.g_attroffset_z_enable = False f3d_mat.rdp_settings.g_packed_normals = False f3d_mat.rdp_settings.g_lighttoalpha = False -f3d_mat.rdp_settings.g_ambocclusion = False -f3d_mat.rdp_settings.g_fresnel = False +f3d_mat.rdp_settings.g_lighting_specular = False +f3d_mat.rdp_settings.g_fresnel_color = False +f3d_mat.rdp_settings.g_fresnel_alpha = False f3d_mat.rdp_settings.g_fog = False f3d_mat.rdp_settings.g_lighting = False f3d_mat.rdp_settings.g_tex_gen = False @@ -3796,14 +3854,16 @@ f3d_mat.use_global_fog = True f3d_mat.rdp_settings.name = '' f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = False -f3d_mat.rdp_settings.g_attroffset_st_enable = False -f3d_mat.rdp_settings.g_attroffset_z_enable = False f3d_mat.rdp_settings.g_packed_normals = False f3d_mat.rdp_settings.g_lighttoalpha = False -f3d_mat.rdp_settings.g_ambocclusion = False -f3d_mat.rdp_settings.g_fresnel = False +f3d_mat.rdp_settings.g_lighting_specular = False +f3d_mat.rdp_settings.g_fresnel_color = False +f3d_mat.rdp_settings.g_fresnel_alpha = False f3d_mat.rdp_settings.g_fog = False f3d_mat.rdp_settings.g_lighting = True f3d_mat.rdp_settings.g_tex_gen = False @@ -3926,14 +3986,16 @@ f3d_mat.use_global_fog = True f3d_mat.rdp_settings.name = '' f3d_mat.rdp_settings.g_zbuffer = True f3d_mat.rdp_settings.g_shade = True +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False f3d_mat.rdp_settings.g_cull_front = False f3d_mat.rdp_settings.g_cull_back = False -f3d_mat.rdp_settings.g_attroffset_st_enable = False -f3d_mat.rdp_settings.g_attroffset_z_enable = False f3d_mat.rdp_settings.g_packed_normals = False f3d_mat.rdp_settings.g_lighttoalpha = False -f3d_mat.rdp_settings.g_ambocclusion = False -f3d_mat.rdp_settings.g_fresnel = False +f3d_mat.rdp_settings.g_lighting_specular = False +f3d_mat.rdp_settings.g_fresnel_color = False +f3d_mat.rdp_settings.g_fresnel_alpha = False f3d_mat.rdp_settings.g_fog = False f3d_mat.rdp_settings.g_lighting = True f3d_mat.rdp_settings.g_tex_gen = False diff --git a/fast64_internal/f3d/f3d_parser.py b/fast64_internal/f3d/f3d_parser.py index cda960e..0fd2593 100644 --- a/fast64_internal/f3d/f3d_parser.py +++ b/fast64_internal/f3d/f3d_parser.py @@ -882,18 +882,22 @@ class F3DContext: if bitFlags & self.f3d.G_CULL_BACK: mat.rdp_settings.g_cull_back = value if self.f3d.F3DEX_GBI_3: - if bitFlags & self.f3d.G_ATTROFFSET_ST_ENABLE: - mat.rdp_settings.g_attroffset_st_enable = value + if bitFlags & self.f3d.G_AMBOCCLUSION: + mat.rdp_settings.g_ambocclusion = value if bitFlags & self.f3d.G_ATTROFFSET_Z_ENABLE: mat.rdp_settings.g_attroffset_z_enable = value + if bitFlags & self.f3d.G_ATTROFFSET_ST_ENABLE: + mat.rdp_settings.g_attroffset_st_enable = value if bitFlags & self.f3d.G_PACKED_NORMALS: mat.rdp_settings.g_packed_normals = value if bitFlags & self.f3d.G_LIGHTTOALPHA: mat.rdp_settings.g_lighttoalpha = value - if bitFlags & self.f3d.G_AMBOCCLUSION: - mat.rdp_settings.g_ambocclusion = value - if bitFlags & self.f3d.G_FRESNEL: - mat.rdp_settings.g_fresnel = value + if bitFlags & self.f3d.G_LIGHTING_SPECULAR: + mat.rdp_settings.g_lighting_specular = value + if bitFlags & self.f3d.G_FRESNEL_COLOR: + mat.rdp_settings.g_fresnel_color = value + if bitFlags & self.f3d.G_FRESNEL_ALPHA: + mat.rdp_settings.g_fresnel_alpha = value if bitFlags & self.f3d.G_FOG: mat.rdp_settings.g_fog = value if bitFlags & self.f3d.G_LIGHTING: @@ -919,19 +923,23 @@ class F3DContext: mat.rdp_settings.g_cull_front = bitFlags & self.f3d.G_CULL_FRONT != 0 mat.rdp_settings.g_cull_back = bitFlags & self.f3d.G_CULL_BACK != 0 if self.f3d.F3DEX_GBI_3: - mat.rdp_settings.g_attroffset_st_enable = bitFlags & self.f3d.G_ATTROFFSET_ST_ENABLE != 0 + mat.rdp_settings.g_ambocclusion = bitFlags & self.f3d.G_AMBOCCLUSION != 0 mat.rdp_settings.g_attroffset_z_enable = bitFlags & self.f3d.G_ATTROFFSET_Z_ENABLE != 0 + mat.rdp_settings.g_attroffset_st_enable = bitFlags & self.f3d.G_ATTROFFSET_ST_ENABLE != 0 mat.rdp_settings.g_packed_normals = bitFlags & self.f3d.G_PACKED_NORMALS != 0 mat.rdp_settings.g_lighttoalpha = bitFlags & self.f3d.G_LIGHTTOALPHA != 0 - mat.rdp_settings.g_ambocclusion = bitFlags & self.f3d.G_AMBOCCLUSION != 0 - mat.rdp_settings.g_fresnel = bitFlags & self.f3d.G_FRESNEL != 0 + mat.rdp_settings.g_lighting_specular = bitFlags & self.f3d.G_LIGHTING_SPECULAR != 0 + mat.rdp_settings.g_fresnel_color = bitFlags & self.f3d.G_FRESNEL_COLOR != 0 + mat.rdp_settings.g_fresnel_alpha = bitFlags & self.f3d.G_FRESNEL_ALPHA != 0 else: - mat.rdp_settings.g_attroffset_st_enable = False + mat.rdp_settings.g_ambocclusion = False mat.rdp_settings.g_attroffset_z_enable = False + mat.rdp_settings.g_attroffset_st_enable = False mat.rdp_settings.g_packed_normals = False mat.rdp_settings.g_lighttoalpha = False - mat.rdp_settings.g_ambocclusion = False - mat.rdp_settings.g_fresnel = False + mat.rdp_settings.g_lighting_specular = False + mat.rdp_settings.g_fresnel_color = False + mat.rdp_settings.g_fresnel_alpha = False mat.rdp_settings.g_fog = bitFlags & self.f3d.G_FOG != 0 mat.rdp_settings.g_lighting = bitFlags & self.f3d.G_LIGHTING != 0 mat.rdp_settings.g_tex_gen = bitFlags & self.f3d.G_TEXTURE_GEN != 0 @@ -1579,17 +1587,35 @@ class F3DContext: self.setLightColor(dlData, command) elif command.name[:13] == "gsSPSetLights": self.setLights(dlData, command) - elif command.name == "gsSPAmbOcclusion": + elif command.name == "gsSPAmbOcclusionAmb": + mat.ao_ambient = float(int(command.params[0], 0)) / (2**16) + mat.set_ao = True + elif command.name == "gsSPAmbOcclusionDir": + mat.ao_directional = float(int(command.params[0], 0)) / (2**16) + mat.set_ao = True + elif command.name == "gsSPAmbOcclusionPoint": + mat.ao_point = float(int(command.params[0], 0)) / (2**16) + mat.set_ao = True + elif command.name == "gsSPAmbOcclusionAmbDir": mat.ao_ambient = float(int(command.params[0], 0)) / (2**16) mat.ao_directional = float(int(command.params[1], 0)) / (2**16) mat.set_ao = True + elif command.name == "gsSPAmbOcclusionDirPoint": + mat.ao_directional = float(int(command.params[0], 0)) / (2**16) + mat.ao_point = float(int(command.params[1], 0)) / (2**16) + mat.set_ao = True + elif command.name == "gsSPAmbOcclusion": + mat.ao_ambient = float(int(command.params[0], 0)) / (2**16) + mat.ao_directional = float(int(command.params[1], 0)) / (2**16) + mat.ao_point = float(int(command.params[2], 0)) / (2**16) + mat.set_ao = True elif command.name == "gsSPFresnel": - offset = min(float(int(command.params[0], 0)) / (2**15), 1.0) - scale = int(command.params[1], 0) - scaleInt = scale - 0x10000 if scale >= 0x8000 else scale - scale = float(scaleInt) / (2**8) - mat.fresnel_lo = offset - mat.fresnel_hi = (1.0 / scale) + offset + scale = int_from_s16_str(command.params[0]) + offset = int_from_s16_str(command.params[1]) + dotMax = ((0x7F - offset) << 15) // scale + dotMin = ((0x00 - offset) << 15) // scale + mat.fresnel_hi = dotMax / float(0x7FFF) + mat.fresnel_lo = dotMin / float(0x7FFF) mat.set_fresnel = True elif command.name == "gsSPAttrOffsetST": mat.attroffs_st = [ diff --git a/fast64_internal/f3d/f3d_writer.py b/fast64_internal/f3d/f3d_writer.py index 38efb33..dcd1322 100644 --- a/fast64_internal/f3d/f3d_writer.py +++ b/fast64_internal/f3d/f3d_writer.py @@ -1268,14 +1268,16 @@ def saveOrGetF3DMaterial(material, fModel, obj, drawLayer, convertTextureData): SPAmbOcclusion( min(round(f3dMat.ao_ambient * 2**16), 0xFFFF), min(round(f3dMat.ao_directional * 2**16), 0xFFFF), + min(round(f3dMat.ao_point * 2**16), 0xFFFF), ) ) if f3dMat.set_fresnel: - offset = min(round(f3dMat.fresnel_lo * 2**15), 0x7FFF) - scalePre = 256.0 / (f3dMat.fresnel_hi - f3dMat.fresnel_lo) - scale = max(min(round(scalePre), 0x7FFF), -0x8000) - fMaterial.mat_only_DL.commands.append(SPFresnel(offset, scale)) + dotMin = round(f3dMat.fresnel_lo * 0x7FFF) + dotMax = round(f3dMat.fresnel_hi * 0x7FFF) + scale = max(min(0x3F8000 // (dotMax - dotMin), 0x7FFF), -0x8000) + offset = max(min(-(0x7F * dotMin) // (dotMax - dotMin), 0x7FFF), -0x8000) + fMaterial.mat_only_DL.commands.append(SPFresnel(scale, offset)) if f3dMat.set_attroffs_st: fMaterial.mat_only_DL.commands.append( @@ -1493,12 +1495,14 @@ def saveGeoModeCommon(saveFunc: Callable, settings: RDPSettings, defaults: RDPSe saveFunc(settings.g_cull_front, defaults.g_cull_front, "G_CULL_FRONT", *args) saveFunc(settings.g_cull_back, defaults.g_cull_back, "G_CULL_BACK", *args) if bpy.context.scene.f3d_type == "F3DEX3": - saveFunc(settings.g_attroffset_st_enable, defaults.g_attroffset_st_enable, "G_ATTROFFSET_ST_ENABLE", *args) + saveFunc(settings.g_ambocclusion, defaults.g_ambocclusion, "G_AMBOCCLUSION", *args) saveFunc(settings.g_attroffset_z_enable, defaults.g_attroffset_z_enable, "G_ATTROFFSET_Z_ENABLE", *args) + saveFunc(settings.g_attroffset_st_enable, defaults.g_attroffset_st_enable, "G_ATTROFFSET_ST_ENABLE", *args) saveFunc(settings.g_packed_normals, defaults.g_packed_normals, "G_PACKED_NORMALS", *args) saveFunc(settings.g_lighttoalpha, defaults.g_lighttoalpha, "G_LIGHTTOALPHA", *args) - saveFunc(settings.g_ambocclusion, defaults.g_ambocclusion, "G_AMBOCCLUSION", *args) - saveFunc(settings.g_fresnel, defaults.g_fresnel, "G_FRESNEL", *args) + saveFunc(settings.g_lighting_specular, defaults.g_lighting_specular, "G_LIGHTING_SPECULAR", *args) + saveFunc(settings.g_fresnel_color, defaults.g_fresnel_color, "G_FRESNEL_COLOR", *args) + saveFunc(settings.g_fresnel_alpha, defaults.g_fresnel_alpha, "G_FRESNEL_ALPHA", *args) saveFunc(settings.g_fog, defaults.g_fog, "G_FOG", *args) saveFunc(settings.g_lighting, defaults.g_lighting, "G_LIGHTING", *args) saveFunc(settings.g_tex_gen, defaults.g_tex_gen, "G_TEXTURE_GEN", *args) From c92bdb8149b97689fedbdcb3bae3d67db56a207b Mon Sep 17 00:00:00 2001 From: Sauraen Date: Mon, 4 Dec 2023 22:04:10 -0800 Subject: [PATCH 58/74] Tweaked sizes --- fast64_internal/f3d/f3d_material.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/fast64_internal/f3d/f3d_material.py b/fast64_internal/f3d/f3d_material.py index 2143782..3ca323e 100644 --- a/fast64_internal/f3d/f3d_material.py +++ b/fast64_internal/f3d/f3d_material.py @@ -927,17 +927,17 @@ class F3DPanel(Panel): def ui_cel_shading(self, material: Material, layout: UILayout): inputGroup = layout.box().column() - r = inputGroup.row().split(factor=0.25) + r = inputGroup.row().split(factor=0.27) r.prop(material.f3d_mat, "use_cel_shading") if not material.f3d_mat.use_cel_shading: return cel = material.f3d_mat.cel_shading - r = r.split(factor=0.3) + r = r.split(factor=0.33) r.label(text="Tint pipeline:") r.prop(cel, "tintPipeline", text="") - r = inputGroup.row().split(factor=0.25) + r = inputGroup.row().split(factor=0.27) r.label(text="") - r = r.split(factor=0.3) + r = r.split(factor=0.33) r.label(text="Cutout:") r.prop(cel, "cutoutSource", text="") From 09ca59b62cd98be5db8384879a5c88cef974b6c2 Mon Sep 17 00:00:00 2001 From: Sauraen Date: Sun, 10 Dec 2023 19:11:38 -0800 Subject: [PATCH 59/74] Adjusted some explanations --- fast64_internal/f3d/f3d_material.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fast64_internal/f3d/f3d_material.py b/fast64_internal/f3d/f3d_material.py index 3ca323e..c58426f 100644 --- a/fast64_internal/f3d/f3d_material.py +++ b/fast64_internal/f3d/f3d_material.py @@ -2887,7 +2887,7 @@ class RDPSettings(PropertyGroup): name="Specular Lighting", default=False, update=update_node_values_with_preset, - description="F3DEX3: Microcode lighting computes specular instead of diffuse component. If using, must set light size field in code", + description="F3DEX3: Microcode lighting computes specular instead of diffuse component. If using, must set size field of every light in code", ) g_fresnel_color: bpy.props.BoolProperty( name="Fresnel to Color", @@ -2899,7 +2899,7 @@ class RDPSettings(PropertyGroup): name="Fresnel to Alpha", default=False, update=update_node_values_with_preset, - description="F3DEX3: Shade alpha derived from how much each vertex normal faces the camera. For water and toon outlines", + description="F3DEX3: Shade alpha derived from how much each vertex normal faces the camera. For water, glass, ghosts, etc., or toon outlines", ) g_fog: bpy.props.BoolProperty( name="Fog", From dcefac5a083ad78c6dc80f78c75cc47c18459976 Mon Sep 17 00:00:00 2001 From: Sauraen Date: Sun, 10 Dec 2023 21:09:50 -0800 Subject: [PATCH 60/74] Added cel shading specific presets --- fast64_internal/f3d/f3d_material_presets.py | 872 ++++++++++++++++++++ 1 file changed, 872 insertions(+) diff --git a/fast64_internal/f3d/f3d_material_presets.py b/fast64_internal/f3d/f3d_material_presets.py index 75ddd80..73670ca 100644 --- a/fast64_internal/f3d/f3d_material_presets.py +++ b/fast64_internal/f3d/f3d_material_presets.py @@ -4047,6 +4047,871 @@ bpy.context.material.f3d_update_flag = False f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update """ +oot_cel_shaded_4_blend_tex_vcol_ao = """ +import bpy +f3d_mat = bpy.context.material.f3d_mat + +bpy.context.material.f3d_update_flag = True +f3d_mat.presetName = 'OoT Cel Shaded 4 Blend Tex VCol AO' +f3d_mat.combiner1.name = '' +f3d_mat.combiner1.A = 'TEXEL0' +f3d_mat.combiner1.B = '0' +f3d_mat.combiner1.C = 'SHADE' +f3d_mat.combiner1.D = '0' +f3d_mat.combiner1.A_alpha = 'SHADE' +f3d_mat.combiner1.B_alpha = '0' +f3d_mat.combiner1.C_alpha = 'TEXEL0' +f3d_mat.combiner1.D_alpha = '0' +f3d_mat.combiner2.name = '' +f3d_mat.combiner2.A = '0' +f3d_mat.combiner2.B = '0' +f3d_mat.combiner2.C = '0' +f3d_mat.combiner2.D = 'SHADE' +f3d_mat.combiner2.A_alpha = '0' +f3d_mat.combiner2.B_alpha = '0' +f3d_mat.combiner2.C_alpha = '0' +f3d_mat.combiner2.D_alpha = '1' +f3d_mat.tex0.name = '' +f3d_mat.tex0.tex_set = True +f3d_mat.tex1.name = '' +f3d_mat.tex1.tex_set = True +f3d_mat.set_prim = False +f3d_mat.set_lights = False +f3d_mat.set_env = True +f3d_mat.set_blend = True +f3d_mat.set_key = True +f3d_mat.set_k0_5 = True +f3d_mat.set_combiner = True +f3d_mat.use_default_lighting = True +f3d_mat.blend_color = (0.0, 0.0, 0.0, 0.5) +f3d_mat.prim_color = (1.0, 1.0, 1.0, 1.0) +f3d_mat.env_color = (0.25979697704315186, 0.09201788902282715, 0.022466713562607765, 1.0) +f3d_mat.key_center = (0.5, 0.5, 0.5, 1.0) +f3d_mat.key_scale = (0.0, 0.0, 0.0) +f3d_mat.key_width = (0.0, 0.0, 0.0) +f3d_mat.k0 = 0.686274528503418 +f3d_mat.k1 = -0.16862745583057404 +f3d_mat.k2 = -0.3490196168422699 +f3d_mat.k3 = 0.8705882430076599 +f3d_mat.k4 = 0.4470588266849518 +f3d_mat.k5 = 0.16470588743686676 +f3d_mat.prim_lod_frac = 0.0 +f3d_mat.prim_lod_min = 0.0 +f3d_mat.default_light_color = (1.0, 1.0, 1.0, 1.0) +f3d_mat.set_ambient_from_light = True +f3d_mat.ambient_light_color = (0.2140410989522934, 0.2140410989522934, 0.2140410989522934, 1.0) +f3d_mat.f3d_light1 = None +f3d_mat.f3d_light2 = None +f3d_mat.f3d_light3 = None +f3d_mat.f3d_light4 = None +f3d_mat.f3d_light5 = None +f3d_mat.f3d_light6 = None +f3d_mat.f3d_light7 = None +f3d_mat.ao_ambient = 1.0 +f3d_mat.ao_directional = 0.625 +f3d_mat.ao_point = 0.0 +f3d_mat.set_ao = False +f3d_mat.fresnel_lo = 0.699999988079071 +f3d_mat.fresnel_hi = 0.4000000059604645 +f3d_mat.set_fresnel = False +f3d_mat.attroffs_st = (0.0, 0.0) +f3d_mat.attroffs_z = -2 +f3d_mat.set_attroffs_st = False +f3d_mat.set_attroffs_z = False +f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) +f3d_mat.fog_position = (985, 1000) +f3d_mat.set_fog = False +f3d_mat.use_global_fog = True +f3d_mat.rdp_settings.name = '' +f3d_mat.rdp_settings.g_zbuffer = True +f3d_mat.rdp_settings.g_shade = True +f3d_mat.rdp_settings.g_ambocclusion = True +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False +f3d_mat.rdp_settings.g_cull_front = False +f3d_mat.rdp_settings.g_cull_back = True +f3d_mat.rdp_settings.g_packed_normals = True +f3d_mat.rdp_settings.g_lighttoalpha = True +f3d_mat.rdp_settings.g_lighting_specular = False +f3d_mat.rdp_settings.g_fresnel_color = False +f3d_mat.rdp_settings.g_fresnel_alpha = False +f3d_mat.rdp_settings.g_fog = False +f3d_mat.rdp_settings.g_lighting = True +f3d_mat.rdp_settings.g_tex_gen = False +f3d_mat.rdp_settings.g_tex_gen_linear = False +f3d_mat.rdp_settings.g_lod = False +f3d_mat.rdp_settings.g_shade_smooth = True +f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_DISABLE' +f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' +f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' +f3d_mat.rdp_settings.g_mdsft_textconv = 'G_TC_FILT' +f3d_mat.rdp_settings.g_mdsft_text_filt = 'G_TF_BILERP' +f3d_mat.rdp_settings.g_mdsft_textlut = 'G_TT_NONE' +f3d_mat.rdp_settings.g_mdsft_textlod = 'G_TL_TILE' +f3d_mat.rdp_settings.num_textures_mipmapped = 2 +f3d_mat.rdp_settings.g_mdsft_textdetail = 'G_TD_CLAMP' +f3d_mat.rdp_settings.g_mdsft_textpersp = 'G_TP_PERSP' +f3d_mat.rdp_settings.g_mdsft_cycletype = 'G_CYC_1CYCLE' +f3d_mat.rdp_settings.g_mdsft_color_dither = 'G_CD_ENABLE' +f3d_mat.rdp_settings.g_mdsft_pipeline = 'G_PM_NPRIMITIVE' +f3d_mat.rdp_settings.g_mdsft_alpha_compare = 'G_AC_THRESHOLD' +f3d_mat.rdp_settings.g_mdsft_zsrcsel = 'G_ZS_PIXEL' +f3d_mat.rdp_settings.prim_depth.name = '' +f3d_mat.rdp_settings.prim_depth.z = 0 +f3d_mat.rdp_settings.prim_depth.dz = 0 +f3d_mat.rdp_settings.clip_ratio = 1 +f3d_mat.rdp_settings.set_rendermode = True +f3d_mat.rdp_settings.rendermode_advanced_enabled = True +f3d_mat.rdp_settings.rendermode_preset_cycle_1 = 'G_RM_AA_ZB_OPA_SURF' +f3d_mat.rdp_settings.rendermode_preset_cycle_2 = 'G_RM_AA_ZB_OPA_SURF2' +f3d_mat.rdp_settings.aa_en = True +f3d_mat.rdp_settings.z_cmp = True +f3d_mat.rdp_settings.z_upd = True +f3d_mat.rdp_settings.im_rd = False +f3d_mat.rdp_settings.clr_on_cvg = False +f3d_mat.rdp_settings.cvg_dst = 'CVG_DST_CLAMP' +f3d_mat.rdp_settings.zmode = 'ZMODE_OPA' +f3d_mat.rdp_settings.cvg_x_alpha = False +f3d_mat.rdp_settings.alpha_cvg_sel = False +f3d_mat.rdp_settings.force_bl = True +f3d_mat.rdp_settings.blend_p1 = 'G_BL_CLR_FOG' +f3d_mat.rdp_settings.blend_p2 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_m1 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_m2 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_a1 = 'G_BL_A_FOG' +f3d_mat.rdp_settings.blend_a2 = 'G_BL_A_IN' +f3d_mat.rdp_settings.blend_b1 = 'G_BL_1MA' +f3d_mat.rdp_settings.blend_b2 = 'G_BL_1MA' +f3d_mat.draw_layer.name = '' +f3d_mat.draw_layer.sm64 = '1' +f3d_mat.draw_layer.oot = 'Opaque' +f3d_mat.large_edges = 'Clamp' +f3d_mat.use_cel_shading = True +f3d_mat.cel_shading.name = '' +f3d_mat.cel_shading.tintPipeline = 'Blender' +f3d_mat.cel_shading.cutoutSource = 'TEXEL0' +f3d_mat.cel_shading.levels.clear() +item_sub_1 = f3d_mat.cel_shading.levels.add() +item_sub_1.name = '' +item_sub_1.threshMode = 'Lighter' +item_sub_1.threshold = 128 +item_sub_1.tintType = 'Fixed' +item_sub_1.tintFixedLevel = 60 +item_sub_1.tintFixedColor = (1.0, 1.0, 1.0) +item_sub_1.tintSegmentNum = 8 +item_sub_1.tintSegmentOffset = 0 +item_sub_1.tintLightSlot = 1 +item_sub_1 = f3d_mat.cel_shading.levels.add() +item_sub_1.name = '' +item_sub_1.threshMode = 'Darker' +item_sub_1.threshold = 128 +item_sub_1.tintType = 'Fixed' +item_sub_1.tintFixedLevel = 140 +item_sub_1.tintFixedColor = (0.012216208502650261, 0.012216208502650261, 0.012216208502650261) +item_sub_1.tintSegmentNum = 8 +item_sub_1.tintSegmentOffset = 0 +item_sub_1.tintLightSlot = 1 +item_sub_1 = f3d_mat.cel_shading.levels.add() +item_sub_1.name = '' +item_sub_1.threshMode = 'Lighter' +item_sub_1.threshold = 240 +item_sub_1.tintType = 'Fixed' +item_sub_1.tintFixedLevel = 150 +item_sub_1.tintFixedColor = (1.0, 1.0, 1.0) +item_sub_1.tintSegmentNum = 8 +item_sub_1.tintSegmentOffset = 0 +item_sub_1.tintLightSlot = 1 +item_sub_1 = f3d_mat.cel_shading.levels.add() +item_sub_1.name = '' +item_sub_1.threshMode = 'Darker' +item_sub_1.threshold = 48 +item_sub_1.tintType = 'Fixed' +item_sub_1.tintFixedLevel = 150 +item_sub_1.tintFixedColor = (0.0, 0.0, 0.0) +item_sub_1.tintSegmentNum = 8 +item_sub_1.tintSegmentOffset = 0 +item_sub_1.tintLightSlot = 1 +bpy.context.material.f3d_update_flag = False +f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update +""" + +oot_cel_shaded_blend_tex_vcol_ltcol = """ +import bpy +f3d_mat = bpy.context.material.f3d_mat + +bpy.context.material.f3d_update_flag = True +f3d_mat.presetName = 'OoT Cel Shaded Blend Tex VCol LtCol' +f3d_mat.combiner1.name = '' +f3d_mat.combiner1.A = 'TEXEL0' +f3d_mat.combiner1.B = '0' +f3d_mat.combiner1.C = 'SHADE' +f3d_mat.combiner1.D = '0' +f3d_mat.combiner1.A_alpha = 'SHADE' +f3d_mat.combiner1.B_alpha = '0' +f3d_mat.combiner1.C_alpha = 'TEXEL0' +f3d_mat.combiner1.D_alpha = '0' +f3d_mat.combiner2.name = '' +f3d_mat.combiner2.A = '0' +f3d_mat.combiner2.B = '0' +f3d_mat.combiner2.C = '0' +f3d_mat.combiner2.D = 'SHADE' +f3d_mat.combiner2.A_alpha = '0' +f3d_mat.combiner2.B_alpha = '0' +f3d_mat.combiner2.C_alpha = '0' +f3d_mat.combiner2.D_alpha = '1' +f3d_mat.tex0.name = '' +f3d_mat.tex0.tex_set = True +f3d_mat.tex1.name = '' +f3d_mat.tex1.tex_set = True +f3d_mat.set_prim = False +f3d_mat.set_lights = False +f3d_mat.set_env = True +f3d_mat.set_blend = True +f3d_mat.set_key = True +f3d_mat.set_k0_5 = True +f3d_mat.set_combiner = True +f3d_mat.use_default_lighting = True +f3d_mat.blend_color = (0.0, 0.0, 0.0, 0.5) +f3d_mat.prim_color = (1.0, 1.0, 1.0, 1.0) +f3d_mat.env_color = (0.25979697704315186, 0.09201788902282715, 0.022466713562607765, 1.0) +f3d_mat.key_center = (0.5, 0.5, 0.5, 1.0) +f3d_mat.key_scale = (0.0, 0.0, 0.0) +f3d_mat.key_width = (0.0, 0.0, 0.0) +f3d_mat.k0 = 0.686274528503418 +f3d_mat.k1 = -0.16862745583057404 +f3d_mat.k2 = -0.3490196168422699 +f3d_mat.k3 = 0.8705882430076599 +f3d_mat.k4 = 0.4470588266849518 +f3d_mat.k5 = 0.16470588743686676 +f3d_mat.prim_lod_frac = 0.0 +f3d_mat.prim_lod_min = 0.0 +f3d_mat.default_light_color = (1.0, 1.0, 1.0, 1.0) +f3d_mat.set_ambient_from_light = True +f3d_mat.ambient_light_color = (0.2140410989522934, 0.2140410989522934, 0.2140410989522934, 1.0) +f3d_mat.f3d_light1 = None +f3d_mat.f3d_light2 = None +f3d_mat.f3d_light3 = None +f3d_mat.f3d_light4 = None +f3d_mat.f3d_light5 = None +f3d_mat.f3d_light6 = None +f3d_mat.f3d_light7 = None +f3d_mat.ao_ambient = 1.0 +f3d_mat.ao_directional = 0.625 +f3d_mat.ao_point = 0.0 +f3d_mat.set_ao = False +f3d_mat.fresnel_lo = 0.699999988079071 +f3d_mat.fresnel_hi = 0.4000000059604645 +f3d_mat.set_fresnel = False +f3d_mat.attroffs_st = (0.0, 0.0) +f3d_mat.attroffs_z = -2 +f3d_mat.set_attroffs_st = False +f3d_mat.set_attroffs_z = False +f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) +f3d_mat.fog_position = (985, 1000) +f3d_mat.set_fog = False +f3d_mat.use_global_fog = True +f3d_mat.rdp_settings.name = '' +f3d_mat.rdp_settings.g_zbuffer = True +f3d_mat.rdp_settings.g_shade = True +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False +f3d_mat.rdp_settings.g_cull_front = False +f3d_mat.rdp_settings.g_cull_back = True +f3d_mat.rdp_settings.g_packed_normals = True +f3d_mat.rdp_settings.g_lighttoalpha = True +f3d_mat.rdp_settings.g_lighting_specular = False +f3d_mat.rdp_settings.g_fresnel_color = False +f3d_mat.rdp_settings.g_fresnel_alpha = False +f3d_mat.rdp_settings.g_fog = False +f3d_mat.rdp_settings.g_lighting = True +f3d_mat.rdp_settings.g_tex_gen = False +f3d_mat.rdp_settings.g_tex_gen_linear = False +f3d_mat.rdp_settings.g_lod = False +f3d_mat.rdp_settings.g_shade_smooth = True +f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_DISABLE' +f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' +f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' +f3d_mat.rdp_settings.g_mdsft_textconv = 'G_TC_FILT' +f3d_mat.rdp_settings.g_mdsft_text_filt = 'G_TF_BILERP' +f3d_mat.rdp_settings.g_mdsft_textlut = 'G_TT_NONE' +f3d_mat.rdp_settings.g_mdsft_textlod = 'G_TL_TILE' +f3d_mat.rdp_settings.num_textures_mipmapped = 2 +f3d_mat.rdp_settings.g_mdsft_textdetail = 'G_TD_CLAMP' +f3d_mat.rdp_settings.g_mdsft_textpersp = 'G_TP_PERSP' +f3d_mat.rdp_settings.g_mdsft_cycletype = 'G_CYC_1CYCLE' +f3d_mat.rdp_settings.g_mdsft_color_dither = 'G_CD_ENABLE' +f3d_mat.rdp_settings.g_mdsft_pipeline = 'G_PM_NPRIMITIVE' +f3d_mat.rdp_settings.g_mdsft_alpha_compare = 'G_AC_THRESHOLD' +f3d_mat.rdp_settings.g_mdsft_zsrcsel = 'G_ZS_PIXEL' +f3d_mat.rdp_settings.prim_depth.name = '' +f3d_mat.rdp_settings.prim_depth.z = 0 +f3d_mat.rdp_settings.prim_depth.dz = 0 +f3d_mat.rdp_settings.clip_ratio = 1 +f3d_mat.rdp_settings.set_rendermode = True +f3d_mat.rdp_settings.rendermode_advanced_enabled = True +f3d_mat.rdp_settings.rendermode_preset_cycle_1 = 'G_RM_AA_ZB_OPA_SURF' +f3d_mat.rdp_settings.rendermode_preset_cycle_2 = 'G_RM_AA_ZB_OPA_SURF2' +f3d_mat.rdp_settings.aa_en = True +f3d_mat.rdp_settings.z_cmp = True +f3d_mat.rdp_settings.z_upd = True +f3d_mat.rdp_settings.im_rd = False +f3d_mat.rdp_settings.clr_on_cvg = False +f3d_mat.rdp_settings.cvg_dst = 'CVG_DST_CLAMP' +f3d_mat.rdp_settings.zmode = 'ZMODE_OPA' +f3d_mat.rdp_settings.cvg_x_alpha = False +f3d_mat.rdp_settings.alpha_cvg_sel = False +f3d_mat.rdp_settings.force_bl = True +f3d_mat.rdp_settings.blend_p1 = 'G_BL_CLR_FOG' +f3d_mat.rdp_settings.blend_p2 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_m1 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_m2 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_a1 = 'G_BL_A_FOG' +f3d_mat.rdp_settings.blend_a2 = 'G_BL_A_IN' +f3d_mat.rdp_settings.blend_b1 = 'G_BL_1MA' +f3d_mat.rdp_settings.blend_b2 = 'G_BL_1MA' +f3d_mat.draw_layer.name = '' +f3d_mat.draw_layer.sm64 = '1' +f3d_mat.draw_layer.oot = 'Opaque' +f3d_mat.large_edges = 'Clamp' +f3d_mat.use_cel_shading = True +f3d_mat.cel_shading.name = '' +f3d_mat.cel_shading.tintPipeline = 'Blender' +f3d_mat.cel_shading.cutoutSource = 'TEXEL0' +f3d_mat.cel_shading.levels.clear() +item_sub_1 = f3d_mat.cel_shading.levels.add() +item_sub_1.name = '' +item_sub_1.threshMode = 'Lighter' +item_sub_1.threshold = 128 +item_sub_1.tintType = 'Light' +item_sub_1.tintFixedLevel = 60 +item_sub_1.tintFixedColor = (1.0, 1.0, 1.0) +item_sub_1.tintSegmentNum = 8 +item_sub_1.tintSegmentOffset = 0 +item_sub_1.tintLightSlot = 1 +item_sub_1 = f3d_mat.cel_shading.levels.add() +item_sub_1.name = '' +item_sub_1.threshMode = 'Darker' +item_sub_1.threshold = 128 +item_sub_1.tintType = 'Light' +item_sub_1.tintFixedLevel = 140 +item_sub_1.tintFixedColor = (0.012216208502650261, 0.012216208502650261, 0.012216208502650261) +item_sub_1.tintSegmentNum = 8 +item_sub_1.tintSegmentOffset = 0 +item_sub_1.tintLightSlot = 0 +bpy.context.material.f3d_update_flag = False +f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update +""" + +oot_cel_shaded_blend_tex_vcol_ltcol_ao = """ +import bpy +f3d_mat = bpy.context.material.f3d_mat + +bpy.context.material.f3d_update_flag = True +f3d_mat.presetName = 'OoT Cel Shaded Blend Tex VCol LtCol AO' +f3d_mat.combiner1.name = '' +f3d_mat.combiner1.A = 'TEXEL0' +f3d_mat.combiner1.B = '0' +f3d_mat.combiner1.C = 'SHADE' +f3d_mat.combiner1.D = '0' +f3d_mat.combiner1.A_alpha = 'SHADE' +f3d_mat.combiner1.B_alpha = '0' +f3d_mat.combiner1.C_alpha = 'TEXEL0' +f3d_mat.combiner1.D_alpha = '0' +f3d_mat.combiner2.name = '' +f3d_mat.combiner2.A = '0' +f3d_mat.combiner2.B = '0' +f3d_mat.combiner2.C = '0' +f3d_mat.combiner2.D = 'SHADE' +f3d_mat.combiner2.A_alpha = '0' +f3d_mat.combiner2.B_alpha = '0' +f3d_mat.combiner2.C_alpha = '0' +f3d_mat.combiner2.D_alpha = '1' +f3d_mat.tex0.name = '' +f3d_mat.tex0.tex_set = True +f3d_mat.tex1.name = '' +f3d_mat.tex1.tex_set = True +f3d_mat.set_prim = False +f3d_mat.set_lights = False +f3d_mat.set_env = True +f3d_mat.set_blend = False +f3d_mat.set_key = True +f3d_mat.set_k0_5 = True +f3d_mat.set_combiner = True +f3d_mat.use_default_lighting = True +f3d_mat.blend_color = (0.0, 0.0, 0.0, 0.5) +f3d_mat.prim_color = (1.0, 1.0, 1.0, 1.0) +f3d_mat.env_color = (0.25979697704315186, 0.09201788902282715, 0.022466713562607765, 1.0) +f3d_mat.key_center = (0.5, 0.5, 0.5, 1.0) +f3d_mat.key_scale = (0.0, 0.0, 0.0) +f3d_mat.key_width = (0.0, 0.0, 0.0) +f3d_mat.k0 = 0.686274528503418 +f3d_mat.k1 = -0.16862745583057404 +f3d_mat.k2 = -0.3490196168422699 +f3d_mat.k3 = 0.8705882430076599 +f3d_mat.k4 = 0.4470588266849518 +f3d_mat.k5 = 0.16470588743686676 +f3d_mat.prim_lod_frac = 0.0 +f3d_mat.prim_lod_min = 0.0 +f3d_mat.default_light_color = (1.0, 1.0, 1.0, 1.0) +f3d_mat.set_ambient_from_light = True +f3d_mat.ambient_light_color = (0.2140410989522934, 0.2140410989522934, 0.2140410989522934, 1.0) +f3d_mat.f3d_light1 = None +f3d_mat.f3d_light2 = None +f3d_mat.f3d_light3 = None +f3d_mat.f3d_light4 = None +f3d_mat.f3d_light5 = None +f3d_mat.f3d_light6 = None +f3d_mat.f3d_light7 = None +f3d_mat.ao_ambient = 1.0 +f3d_mat.ao_directional = 0.625 +f3d_mat.ao_point = 0.0 +f3d_mat.set_ao = False +f3d_mat.fresnel_lo = 0.699999988079071 +f3d_mat.fresnel_hi = 0.4000000059604645 +f3d_mat.set_fresnel = False +f3d_mat.attroffs_st = (0.0, 0.0) +f3d_mat.attroffs_z = -2 +f3d_mat.set_attroffs_st = False +f3d_mat.set_attroffs_z = False +f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) +f3d_mat.fog_position = (985, 1000) +f3d_mat.set_fog = False +f3d_mat.use_global_fog = True +f3d_mat.rdp_settings.name = '' +f3d_mat.rdp_settings.g_zbuffer = True +f3d_mat.rdp_settings.g_shade = True +f3d_mat.rdp_settings.g_ambocclusion = True +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False +f3d_mat.rdp_settings.g_cull_front = False +f3d_mat.rdp_settings.g_cull_back = True +f3d_mat.rdp_settings.g_packed_normals = True +f3d_mat.rdp_settings.g_lighttoalpha = True +f3d_mat.rdp_settings.g_lighting_specular = False +f3d_mat.rdp_settings.g_fresnel_color = False +f3d_mat.rdp_settings.g_fresnel_alpha = False +f3d_mat.rdp_settings.g_fog = False +f3d_mat.rdp_settings.g_lighting = True +f3d_mat.rdp_settings.g_tex_gen = False +f3d_mat.rdp_settings.g_tex_gen_linear = False +f3d_mat.rdp_settings.g_lod = False +f3d_mat.rdp_settings.g_shade_smooth = True +f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_DISABLE' +f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' +f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' +f3d_mat.rdp_settings.g_mdsft_textconv = 'G_TC_FILT' +f3d_mat.rdp_settings.g_mdsft_text_filt = 'G_TF_BILERP' +f3d_mat.rdp_settings.g_mdsft_textlut = 'G_TT_NONE' +f3d_mat.rdp_settings.g_mdsft_textlod = 'G_TL_TILE' +f3d_mat.rdp_settings.num_textures_mipmapped = 2 +f3d_mat.rdp_settings.g_mdsft_textdetail = 'G_TD_CLAMP' +f3d_mat.rdp_settings.g_mdsft_textpersp = 'G_TP_PERSP' +f3d_mat.rdp_settings.g_mdsft_cycletype = 'G_CYC_1CYCLE' +f3d_mat.rdp_settings.g_mdsft_color_dither = 'G_CD_ENABLE' +f3d_mat.rdp_settings.g_mdsft_pipeline = 'G_PM_NPRIMITIVE' +f3d_mat.rdp_settings.g_mdsft_alpha_compare = 'G_AC_THRESHOLD' +f3d_mat.rdp_settings.g_mdsft_zsrcsel = 'G_ZS_PIXEL' +f3d_mat.rdp_settings.prim_depth.name = '' +f3d_mat.rdp_settings.prim_depth.z = 0 +f3d_mat.rdp_settings.prim_depth.dz = 0 +f3d_mat.rdp_settings.clip_ratio = 1 +f3d_mat.rdp_settings.set_rendermode = True +f3d_mat.rdp_settings.rendermode_advanced_enabled = True +f3d_mat.rdp_settings.rendermode_preset_cycle_1 = 'G_RM_AA_ZB_OPA_SURF' +f3d_mat.rdp_settings.rendermode_preset_cycle_2 = 'G_RM_AA_ZB_OPA_SURF2' +f3d_mat.rdp_settings.aa_en = True +f3d_mat.rdp_settings.z_cmp = True +f3d_mat.rdp_settings.z_upd = True +f3d_mat.rdp_settings.im_rd = False +f3d_mat.rdp_settings.clr_on_cvg = False +f3d_mat.rdp_settings.cvg_dst = 'CVG_DST_CLAMP' +f3d_mat.rdp_settings.zmode = 'ZMODE_OPA' +f3d_mat.rdp_settings.cvg_x_alpha = False +f3d_mat.rdp_settings.alpha_cvg_sel = False +f3d_mat.rdp_settings.force_bl = True +f3d_mat.rdp_settings.blend_p1 = 'G_BL_CLR_FOG' +f3d_mat.rdp_settings.blend_p2 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_m1 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_m2 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_a1 = 'G_BL_A_FOG' +f3d_mat.rdp_settings.blend_a2 = 'G_BL_A_IN' +f3d_mat.rdp_settings.blend_b1 = 'G_BL_1MA' +f3d_mat.rdp_settings.blend_b2 = 'G_BL_1MA' +f3d_mat.draw_layer.name = '' +f3d_mat.draw_layer.sm64 = '1' +f3d_mat.draw_layer.oot = 'Opaque' +f3d_mat.large_edges = 'Clamp' +f3d_mat.use_cel_shading = True +f3d_mat.cel_shading.name = '' +f3d_mat.cel_shading.tintPipeline = 'Blender' +f3d_mat.cel_shading.cutoutSource = 'TEXEL0' +f3d_mat.cel_shading.levels.clear() +item_sub_1 = f3d_mat.cel_shading.levels.add() +item_sub_1.name = '' +item_sub_1.threshMode = 'Lighter' +item_sub_1.threshold = 128 +item_sub_1.tintType = 'Light' +item_sub_1.tintFixedLevel = 60 +item_sub_1.tintFixedColor = (1.0, 1.0, 1.0) +item_sub_1.tintSegmentNum = 8 +item_sub_1.tintSegmentOffset = 0 +item_sub_1.tintLightSlot = 1 +item_sub_1 = f3d_mat.cel_shading.levels.add() +item_sub_1.name = '' +item_sub_1.threshMode = 'Darker' +item_sub_1.threshold = 128 +item_sub_1.tintType = 'Light' +item_sub_1.tintFixedLevel = 140 +item_sub_1.tintFixedColor = (0.012216208502650261, 0.012216208502650261, 0.012216208502650261) +item_sub_1.tintSegmentNum = 8 +item_sub_1.tintSegmentOffset = 0 +item_sub_1.tintLightSlot = 0 +bpy.context.material.f3d_update_flag = False +f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update +""" + +oot_cel_shaded_blend_vcol = """ +import bpy +f3d_mat = bpy.context.material.f3d_mat + +bpy.context.material.f3d_update_flag = True +f3d_mat.presetName = 'OoT Cel Shaded Blend VCol' +f3d_mat.combiner1.name = '' +f3d_mat.combiner1.A = '0' +f3d_mat.combiner1.B = '0' +f3d_mat.combiner1.C = '0' +f3d_mat.combiner1.D = 'SHADE' +f3d_mat.combiner1.A_alpha = 'SHADE' +f3d_mat.combiner1.B_alpha = '0' +f3d_mat.combiner1.C_alpha = 'ENVIRONMENT' +f3d_mat.combiner1.D_alpha = '0' +f3d_mat.combiner2.name = '' +f3d_mat.combiner2.A = '0' +f3d_mat.combiner2.B = '0' +f3d_mat.combiner2.C = '0' +f3d_mat.combiner2.D = 'SHADE' +f3d_mat.combiner2.A_alpha = '0' +f3d_mat.combiner2.B_alpha = '0' +f3d_mat.combiner2.C_alpha = '0' +f3d_mat.combiner2.D_alpha = '1' +f3d_mat.tex0.name = '' +f3d_mat.tex0.tex_set = True +f3d_mat.tex1.name = '' +f3d_mat.tex1.tex_set = True +f3d_mat.set_prim = False +f3d_mat.set_lights = False +f3d_mat.set_env = True +f3d_mat.set_blend = True +f3d_mat.set_key = True +f3d_mat.set_k0_5 = True +f3d_mat.set_combiner = True +f3d_mat.use_default_lighting = True +f3d_mat.blend_color = (0.0, 0.0, 0.0, 0.5) +f3d_mat.prim_color = (1.0, 1.0, 1.0, 1.0) +f3d_mat.env_color = (0.25979697704315186, 0.09201788902282715, 0.022466713562607765, 1.0) +f3d_mat.key_center = (0.5, 0.5, 0.5, 1.0) +f3d_mat.key_scale = (0.0, 0.0, 0.0) +f3d_mat.key_width = (0.0, 0.0, 0.0) +f3d_mat.k0 = 0.686274528503418 +f3d_mat.k1 = -0.16862745583057404 +f3d_mat.k2 = -0.3490196168422699 +f3d_mat.k3 = 0.8705882430076599 +f3d_mat.k4 = 0.4470588266849518 +f3d_mat.k5 = 0.16470588743686676 +f3d_mat.prim_lod_frac = 0.0 +f3d_mat.prim_lod_min = 0.0 +f3d_mat.default_light_color = (1.0, 1.0, 1.0, 1.0) +f3d_mat.set_ambient_from_light = True +f3d_mat.ambient_light_color = (0.2140410989522934, 0.2140410989522934, 0.2140410989522934, 1.0) +f3d_mat.f3d_light1 = None +f3d_mat.f3d_light2 = None +f3d_mat.f3d_light3 = None +f3d_mat.f3d_light4 = None +f3d_mat.f3d_light5 = None +f3d_mat.f3d_light6 = None +f3d_mat.f3d_light7 = None +f3d_mat.ao_ambient = 1.0 +f3d_mat.ao_directional = 0.625 +f3d_mat.ao_point = 0.0 +f3d_mat.set_ao = False +f3d_mat.fresnel_lo = 0.699999988079071 +f3d_mat.fresnel_hi = 0.4000000059604645 +f3d_mat.set_fresnel = False +f3d_mat.attroffs_st = (0.0, 0.0) +f3d_mat.attroffs_z = -2 +f3d_mat.set_attroffs_st = False +f3d_mat.set_attroffs_z = False +f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) +f3d_mat.fog_position = (985, 1000) +f3d_mat.set_fog = False +f3d_mat.use_global_fog = True +f3d_mat.rdp_settings.name = '' +f3d_mat.rdp_settings.g_zbuffer = True +f3d_mat.rdp_settings.g_shade = True +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False +f3d_mat.rdp_settings.g_cull_front = False +f3d_mat.rdp_settings.g_cull_back = True +f3d_mat.rdp_settings.g_packed_normals = True +f3d_mat.rdp_settings.g_lighttoalpha = True +f3d_mat.rdp_settings.g_lighting_specular = False +f3d_mat.rdp_settings.g_fresnel_color = False +f3d_mat.rdp_settings.g_fresnel_alpha = False +f3d_mat.rdp_settings.g_fog = False +f3d_mat.rdp_settings.g_lighting = True +f3d_mat.rdp_settings.g_tex_gen = False +f3d_mat.rdp_settings.g_tex_gen_linear = False +f3d_mat.rdp_settings.g_lod = False +f3d_mat.rdp_settings.g_shade_smooth = True +f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_DISABLE' +f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' +f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' +f3d_mat.rdp_settings.g_mdsft_textconv = 'G_TC_FILT' +f3d_mat.rdp_settings.g_mdsft_text_filt = 'G_TF_BILERP' +f3d_mat.rdp_settings.g_mdsft_textlut = 'G_TT_NONE' +f3d_mat.rdp_settings.g_mdsft_textlod = 'G_TL_TILE' +f3d_mat.rdp_settings.num_textures_mipmapped = 2 +f3d_mat.rdp_settings.g_mdsft_textdetail = 'G_TD_CLAMP' +f3d_mat.rdp_settings.g_mdsft_textpersp = 'G_TP_PERSP' +f3d_mat.rdp_settings.g_mdsft_cycletype = 'G_CYC_1CYCLE' +f3d_mat.rdp_settings.g_mdsft_color_dither = 'G_CD_ENABLE' +f3d_mat.rdp_settings.g_mdsft_pipeline = 'G_PM_NPRIMITIVE' +f3d_mat.rdp_settings.g_mdsft_alpha_compare = 'G_AC_THRESHOLD' +f3d_mat.rdp_settings.g_mdsft_zsrcsel = 'G_ZS_PIXEL' +f3d_mat.rdp_settings.prim_depth.name = '' +f3d_mat.rdp_settings.prim_depth.z = 0 +f3d_mat.rdp_settings.prim_depth.dz = 0 +f3d_mat.rdp_settings.clip_ratio = 1 +f3d_mat.rdp_settings.set_rendermode = True +f3d_mat.rdp_settings.rendermode_advanced_enabled = True +f3d_mat.rdp_settings.rendermode_preset_cycle_1 = 'G_RM_AA_ZB_OPA_SURF' +f3d_mat.rdp_settings.rendermode_preset_cycle_2 = 'G_RM_AA_ZB_OPA_SURF2' +f3d_mat.rdp_settings.aa_en = True +f3d_mat.rdp_settings.z_cmp = True +f3d_mat.rdp_settings.z_upd = True +f3d_mat.rdp_settings.im_rd = False +f3d_mat.rdp_settings.clr_on_cvg = False +f3d_mat.rdp_settings.cvg_dst = 'CVG_DST_CLAMP' +f3d_mat.rdp_settings.zmode = 'ZMODE_OPA' +f3d_mat.rdp_settings.cvg_x_alpha = False +f3d_mat.rdp_settings.alpha_cvg_sel = False +f3d_mat.rdp_settings.force_bl = True +f3d_mat.rdp_settings.blend_p1 = 'G_BL_CLR_FOG' +f3d_mat.rdp_settings.blend_p2 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_m1 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_m2 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_a1 = 'G_BL_A_FOG' +f3d_mat.rdp_settings.blend_a2 = 'G_BL_A_IN' +f3d_mat.rdp_settings.blend_b1 = 'G_BL_1MA' +f3d_mat.rdp_settings.blend_b2 = 'G_BL_1MA' +f3d_mat.draw_layer.name = '' +f3d_mat.draw_layer.sm64 = '1' +f3d_mat.draw_layer.oot = 'Opaque' +f3d_mat.large_edges = 'Clamp' +f3d_mat.use_cel_shading = True +f3d_mat.cel_shading.name = '' +f3d_mat.cel_shading.tintPipeline = 'Blender' +f3d_mat.cel_shading.cutoutSource = 'ENVIRONMENT' +f3d_mat.cel_shading.levels.clear() +item_sub_1 = f3d_mat.cel_shading.levels.add() +item_sub_1.name = '' +item_sub_1.threshMode = 'Lighter' +item_sub_1.threshold = 128 +item_sub_1.tintType = 'Fixed' +item_sub_1.tintFixedLevel = 60 +item_sub_1.tintFixedColor = (1.0, 1.0, 1.0) +item_sub_1.tintSegmentNum = 8 +item_sub_1.tintSegmentOffset = 0 +item_sub_1.tintLightSlot = 1 +item_sub_1 = f3d_mat.cel_shading.levels.add() +item_sub_1.name = '' +item_sub_1.threshMode = 'Darker' +item_sub_1.threshold = 128 +item_sub_1.tintType = 'Fixed' +item_sub_1.tintFixedLevel = 140 +item_sub_1.tintFixedColor = (0.012216208502650261, 0.012216208502650261, 0.012216208502650261) +item_sub_1.tintSegmentNum = 8 +item_sub_1.tintSegmentOffset = 0 +item_sub_1.tintLightSlot = 1 +bpy.context.material.f3d_update_flag = False +f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update +""" + +oot_cel_shaded_mul_tex = """ +import bpy +f3d_mat = bpy.context.material.f3d_mat + +bpy.context.material.f3d_update_flag = True +f3d_mat.presetName = 'OoT Cel Shaded Mul Tex' +f3d_mat.combiner1.name = '' +f3d_mat.combiner1.A = 'TEXEL0' +f3d_mat.combiner1.B = '0' +f3d_mat.combiner1.C = 'PRIMITIVE' +f3d_mat.combiner1.D = '0' +f3d_mat.combiner1.A_alpha = 'SHADE' +f3d_mat.combiner1.B_alpha = '0' +f3d_mat.combiner1.C_alpha = 'TEXEL0' +f3d_mat.combiner1.D_alpha = '0' +f3d_mat.combiner2.name = '' +f3d_mat.combiner2.A = '0' +f3d_mat.combiner2.B = '0' +f3d_mat.combiner2.C = '0' +f3d_mat.combiner2.D = 'SHADE' +f3d_mat.combiner2.A_alpha = '0' +f3d_mat.combiner2.B_alpha = '0' +f3d_mat.combiner2.C_alpha = '0' +f3d_mat.combiner2.D_alpha = '1' +f3d_mat.tex0.name = '' +f3d_mat.tex0.tex_set = True +f3d_mat.tex1.name = '' +f3d_mat.tex1.tex_set = True +f3d_mat.set_prim = False +f3d_mat.set_lights = False +f3d_mat.set_env = True +f3d_mat.set_blend = True +f3d_mat.set_key = True +f3d_mat.set_k0_5 = True +f3d_mat.set_combiner = True +f3d_mat.use_default_lighting = True +f3d_mat.blend_color = (0.0, 0.0, 0.0, 0.5) +f3d_mat.prim_color = (1.0, 1.0, 1.0, 1.0) +f3d_mat.env_color = (0.25979697704315186, 0.09201788902282715, 0.022466713562607765, 1.0) +f3d_mat.key_center = (0.5, 0.5, 0.5, 1.0) +f3d_mat.key_scale = (0.0, 0.0, 0.0) +f3d_mat.key_width = (0.0, 0.0, 0.0) +f3d_mat.k0 = 0.686274528503418 +f3d_mat.k1 = -0.16862745583057404 +f3d_mat.k2 = -0.3490196168422699 +f3d_mat.k3 = 0.8705882430076599 +f3d_mat.k4 = 0.4470588266849518 +f3d_mat.k5 = 0.16470588743686676 +f3d_mat.prim_lod_frac = 0.0 +f3d_mat.prim_lod_min = 0.0 +f3d_mat.default_light_color = (1.0, 1.0, 1.0, 1.0) +f3d_mat.set_ambient_from_light = True +f3d_mat.ambient_light_color = (0.2140410989522934, 0.2140410989522934, 0.2140410989522934, 1.0) +f3d_mat.f3d_light1 = None +f3d_mat.f3d_light2 = None +f3d_mat.f3d_light3 = None +f3d_mat.f3d_light4 = None +f3d_mat.f3d_light5 = None +f3d_mat.f3d_light6 = None +f3d_mat.f3d_light7 = None +f3d_mat.ao_ambient = 1.0 +f3d_mat.ao_directional = 0.625 +f3d_mat.ao_point = 0.0 +f3d_mat.set_ao = False +f3d_mat.fresnel_lo = 0.699999988079071 +f3d_mat.fresnel_hi = 0.4000000059604645 +f3d_mat.set_fresnel = False +f3d_mat.attroffs_st = (0.0, 0.0) +f3d_mat.attroffs_z = -2 +f3d_mat.set_attroffs_st = False +f3d_mat.set_attroffs_z = False +f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) +f3d_mat.fog_position = (985, 1000) +f3d_mat.set_fog = False +f3d_mat.use_global_fog = True +f3d_mat.rdp_settings.name = '' +f3d_mat.rdp_settings.g_zbuffer = True +f3d_mat.rdp_settings.g_shade = True +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False +f3d_mat.rdp_settings.g_cull_front = False +f3d_mat.rdp_settings.g_cull_back = True +f3d_mat.rdp_settings.g_packed_normals = False +f3d_mat.rdp_settings.g_lighttoalpha = True +f3d_mat.rdp_settings.g_lighting_specular = False +f3d_mat.rdp_settings.g_fresnel_color = False +f3d_mat.rdp_settings.g_fresnel_alpha = False +f3d_mat.rdp_settings.g_fog = False +f3d_mat.rdp_settings.g_lighting = True +f3d_mat.rdp_settings.g_tex_gen = False +f3d_mat.rdp_settings.g_tex_gen_linear = False +f3d_mat.rdp_settings.g_lod = False +f3d_mat.rdp_settings.g_shade_smooth = True +f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_DISABLE' +f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' +f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' +f3d_mat.rdp_settings.g_mdsft_textconv = 'G_TC_FILT' +f3d_mat.rdp_settings.g_mdsft_text_filt = 'G_TF_BILERP' +f3d_mat.rdp_settings.g_mdsft_textlut = 'G_TT_NONE' +f3d_mat.rdp_settings.g_mdsft_textlod = 'G_TL_TILE' +f3d_mat.rdp_settings.num_textures_mipmapped = 2 +f3d_mat.rdp_settings.g_mdsft_textdetail = 'G_TD_CLAMP' +f3d_mat.rdp_settings.g_mdsft_textpersp = 'G_TP_PERSP' +f3d_mat.rdp_settings.g_mdsft_cycletype = 'G_CYC_1CYCLE' +f3d_mat.rdp_settings.g_mdsft_color_dither = 'G_CD_ENABLE' +f3d_mat.rdp_settings.g_mdsft_pipeline = 'G_PM_NPRIMITIVE' +f3d_mat.rdp_settings.g_mdsft_alpha_compare = 'G_AC_THRESHOLD' +f3d_mat.rdp_settings.g_mdsft_zsrcsel = 'G_ZS_PIXEL' +f3d_mat.rdp_settings.prim_depth.name = '' +f3d_mat.rdp_settings.prim_depth.z = 0 +f3d_mat.rdp_settings.prim_depth.dz = 0 +f3d_mat.rdp_settings.clip_ratio = 1 +f3d_mat.rdp_settings.set_rendermode = True +f3d_mat.rdp_settings.rendermode_advanced_enabled = True +f3d_mat.rdp_settings.rendermode_preset_cycle_1 = 'G_RM_AA_ZB_OPA_SURF' +f3d_mat.rdp_settings.rendermode_preset_cycle_2 = 'G_RM_AA_ZB_OPA_SURF2' +f3d_mat.rdp_settings.aa_en = True +f3d_mat.rdp_settings.z_cmp = True +f3d_mat.rdp_settings.z_upd = True +f3d_mat.rdp_settings.im_rd = False +f3d_mat.rdp_settings.clr_on_cvg = False +f3d_mat.rdp_settings.cvg_dst = 'CVG_DST_CLAMP' +f3d_mat.rdp_settings.zmode = 'ZMODE_OPA' +f3d_mat.rdp_settings.cvg_x_alpha = False +f3d_mat.rdp_settings.alpha_cvg_sel = False +f3d_mat.rdp_settings.force_bl = False +f3d_mat.rdp_settings.blend_p1 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_p2 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_m1 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_m2 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_a1 = 'G_BL_0' +f3d_mat.rdp_settings.blend_a2 = 'G_BL_A_IN' +f3d_mat.rdp_settings.blend_b1 = 'G_BL_1' +f3d_mat.rdp_settings.blend_b2 = 'G_BL_1MA' +f3d_mat.draw_layer.name = '' +f3d_mat.draw_layer.sm64 = '1' +f3d_mat.draw_layer.oot = 'Opaque' +f3d_mat.large_edges = 'Clamp' +f3d_mat.use_cel_shading = True +f3d_mat.cel_shading.name = '' +f3d_mat.cel_shading.tintPipeline = 'CC' +f3d_mat.cel_shading.cutoutSource = 'TEXEL0' +f3d_mat.cel_shading.levels.clear() +item_sub_1 = f3d_mat.cel_shading.levels.add() +item_sub_1.name = '' +item_sub_1.threshMode = 'Lighter' +item_sub_1.threshold = 128 +item_sub_1.tintType = 'Fixed' +item_sub_1.tintFixedLevel = 50 +item_sub_1.tintFixedColor = (1.0, 1.0, 1.0) +item_sub_1.tintSegmentNum = 8 +item_sub_1.tintSegmentOffset = 0 +item_sub_1.tintLightSlot = 1 +item_sub_1 = f3d_mat.cel_shading.levels.add() +item_sub_1.name = '' +item_sub_1.threshMode = 'Darker' +item_sub_1.threshold = 128 +item_sub_1.tintType = 'Fixed' +item_sub_1.tintFixedLevel = 50 +item_sub_1.tintFixedColor = (0.04445325583219528, 0.04445325583219528, 0.04445325583219528) +item_sub_1.tintSegmentNum = 8 +item_sub_1.tintSegmentOffset = 0 +item_sub_1.tintLightSlot = 1 +bpy.context.material.f3d_update_flag = False +f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update +""" + material_presets = { "oot": { "oot_shaded_environment_mapped": oot_shaded_environment_mapped, @@ -4067,6 +4932,13 @@ material_presets = { "oot_vertex_colored_texture_cutout": oot_vertex_colored_texture_cutout, "oot_vertex_colored_texture_transparent": oot_vertex_colored_texture_transparent, }, + "oot_cel": { + "oot_cel_shaded_4_blend_tex_vcol_ao": oot_cel_shaded_4_blend_tex_vcol_ao, + "oot_cel_shaded_blend_tex_vcol_ltcol": oot_cel_shaded_blend_tex_vcol_ltcol, + "oot_cel_shaded_blend_tex_vcol_ltcol_ao": oot_cel_shaded_blend_tex_vcol_ltcol_ao, + "oot_cel_shaded_blend_vcol": oot_cel_shaded_blend_vcol, + "oot_cel_shaded_mul_tex": oot_cel_shaded_mul_tex, + }, "sm64": { "sm64_decal": sm64_decal, "sm64_environment_map": sm64_environment_map, From 0a70df46180960b355913d7a98846c21cf24f1d0 Mon Sep 17 00:00:00 2001 From: Sauraen Date: Sun, 17 Dec 2023 17:21:46 -0800 Subject: [PATCH 61/74] Cel shading UI changes for Yanis --- fast64_internal/f3d/f3d_material.py | 46 ++++++++++++++++++----------- 1 file changed, 29 insertions(+), 17 deletions(-) diff --git a/fast64_internal/f3d/f3d_material.py b/fast64_internal/f3d/f3d_material.py index c58426f..b9308ac 100644 --- a/fast64_internal/f3d/f3d_material.py +++ b/fast64_internal/f3d/f3d_material.py @@ -927,19 +927,24 @@ class F3DPanel(Panel): def ui_cel_shading(self, material: Material, layout: UILayout): inputGroup = layout.box().column() - r = inputGroup.row().split(factor=0.27) + r = inputGroup.row(align=True) + r.prop( + material.f3d_mat, + "expand_cel_shading_ui", + text="", + icon='TRIA_DOWN' if material.f3d_mat.expand_cel_shading_ui else 'TRIA_RIGHT', + icon_only=True, + emboss=False + ) r.prop(material.f3d_mat, "use_cel_shading") - if not material.f3d_mat.use_cel_shading: + if not material.f3d_mat.expand_cel_shading_ui: return + if not material.f3d_mat.use_cel_shading: + inputGroup = inputGroup.column() + inputGroup.enabled = False cel = material.f3d_mat.cel_shading - r = r.split(factor=0.33) - r.label(text="Tint pipeline:") - r.prop(cel, "tintPipeline", text="") - r = inputGroup.row().split(factor=0.27) - r.label(text="") - r = r.split(factor=0.33) - r.label(text="Cutout:") - r.prop(cel, "cutoutSource", text="") + prop_split(inputGroup.row(), cel, "tintPipeline", "Tint pipeline:") + prop_split(inputGroup.row(), cel, "cutoutSource", "Cutout:") if getZMode(material) != "ZMODE_OPA": inputGroup.label(text = "zmode in blender / rendermode must be opaque.", icon = "ERROR") @@ -963,6 +968,14 @@ class F3DPanel(Panel): "ERROR" ) + r = inputGroup.row(align=True) + r.label(text="Cel levels:") + op = r.operator(CelLevelAdd.bl_idname, text="", icon='ADD') + op.materialName = material.name + if len(cel.levels) > 0: + op = r.operator(CelLevelRemove.bl_idname, text="", icon='REMOVE') + op.materialName = material.name + showSegHelp = False for level in cel.levels: box = inputGroup.box().column() @@ -1001,12 +1014,6 @@ class F3DPanel(Panel): 'INFO' ) - r = inputGroup.row() - op = r.operator(CelLevelAdd.bl_idname) - op.materialName = material.name - if len(cel.levels) > 0: - op = r.operator(CelLevelRemove.bl_idname) - op.materialName = material.name def checkDrawLayersWarnings(self, f3dMat: "F3DMaterialProperty", useDict: Dict[str, bool], layout: UILayout): settings = f3dMat.rdp_settings @@ -1227,6 +1234,10 @@ class F3DPanel(Panel): if context.scene.f3d_type == "F3DEX3": self.ui_cel_shading(material, layout) + else: + r = layout.row() + r.enabled = False + r.label(text="Use Cel Shading (requires F3DEX3)", icon='TRIA_RIGHT') def ui_tileScroll(tex, name, layout): @@ -4085,7 +4096,8 @@ class F3DMaterialProperty(PropertyGroup): use_large_textures: bpy.props.BoolProperty(name="Large Texture Mode") large_edges: bpy.props.EnumProperty(items=enumLargeEdges, default="Clamp") - use_cel_shading : bpy.props.BoolProperty(name = "Cel Shading", update = update_cel_cutout_source) + expand_cel_shading_ui : bpy.props.BoolProperty(name = "Expand Cel Shading UI") + use_cel_shading : bpy.props.BoolProperty(name = "Use Cel Shading", update = update_cel_cutout_source) cel_shading : bpy.props.PointerProperty(type = CelShadingProperty) def key(self) -> F3DMaterialHash: From acb78e5ddf31a428b89ef726a5e5aec6b3b2edad Mon Sep 17 00:00:00 2001 From: Sauraen Date: Sun, 17 Dec 2023 19:47:59 -0800 Subject: [PATCH 62/74] Added more presets --- fast64_internal/f3d/f3d_material.py | 6 +- fast64_internal/f3d/f3d_material_presets.py | 2438 ++++++++++++++++++- 2 files changed, 2430 insertions(+), 14 deletions(-) diff --git a/fast64_internal/f3d/f3d_material.py b/fast64_internal/f3d/f3d_material.py index b9308ac..9280665 100644 --- a/fast64_internal/f3d/f3d_material.py +++ b/fast64_internal/f3d/f3d_material.py @@ -1217,8 +1217,8 @@ class F3DPanel(Panel): split.label(text="Preset") row = split.row(align=True) row.menu(MATERIAL_MT_f3d_presets.__name__, text=f3dMat.presetName) - row.operator(AddPresetF3D.bl_idname, text="", icon="ZOOM_IN") - row.operator(AddPresetF3D.bl_idname, text="", icon="ZOOM_OUT").remove_active = True + row.operator(AddPresetF3D.bl_idname, text="", icon="ADD") + row.operator(AddPresetF3D.bl_idname, text="", icon="REMOVE").remove_active = True if settings.g_mdsft_alpha_compare == "G_AC_THRESHOLD" and settings.g_mdsft_cycletype == "G_CYC_2CYCLE": multilineLabel(layout.box(), @@ -3443,7 +3443,7 @@ class MATERIAL_MT_f3d_presets(Menu): if not bpy.context.scene.f3dUserPresetsOnly: paths += bpy.utils.preset_paths(presetDir) if bpy.context.scene.f3d_type == "F3DEX3": - paths += bpy.utils.preset_paths(f"{presetDir}_cel") + paths += bpy.utils.preset_paths(f"{presetDir}_f3dex3") self.path_menu( paths, self.preset_operator, diff --git a/fast64_internal/f3d/f3d_material_presets.py b/fast64_internal/f3d/f3d_material_presets.py index 73670ca..bcdfa07 100644 --- a/fast64_internal/f3d/f3d_material_presets.py +++ b/fast64_internal/f3d/f3d_material_presets.py @@ -4047,7 +4047,7 @@ bpy.context.material.f3d_update_flag = False f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update """ -oot_cel_shaded_4_blend_tex_vcol_ao = """ +oot_cel_4_blend_tex_vcol_ao = """ import bpy f3d_mat = bpy.context.material.f3d_mat @@ -4236,7 +4236,7 @@ bpy.context.material.f3d_update_flag = False f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update """ -oot_cel_shaded_blend_tex_vcol_ltcol = """ +oot_cel_blend_tex_vcol_ltcol = """ import bpy f3d_mat = bpy.context.material.f3d_mat @@ -4405,7 +4405,7 @@ bpy.context.material.f3d_update_flag = False f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update """ -oot_cel_shaded_blend_tex_vcol_ltcol_ao = """ +oot_cel_blend_tex_vcol_ltcol_ao = """ import bpy f3d_mat = bpy.context.material.f3d_mat @@ -4574,7 +4574,7 @@ bpy.context.material.f3d_update_flag = False f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update """ -oot_cel_shaded_blend_vcol = """ +oot_cel_blend_vcol = """ import bpy f3d_mat = bpy.context.material.f3d_mat @@ -4743,7 +4743,7 @@ bpy.context.material.f3d_update_flag = False f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update """ -oot_cel_shaded_mul_tex = """ +oot_cel_mul_tex = """ import bpy f3d_mat = bpy.context.material.f3d_mat @@ -4912,6 +4912,2406 @@ bpy.context.material.f3d_update_flag = False f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update """ +oot_ghost_fresnel = """ +import bpy +f3d_mat = bpy.context.material.f3d_mat + +bpy.context.material.f3d_update_flag = True +f3d_mat.presetName = 'Oot Ghost Fresnel' +f3d_mat.combiner1.name = '' +f3d_mat.combiner1.A = '0' +f3d_mat.combiner1.B = '0' +f3d_mat.combiner1.C = '0' +f3d_mat.combiner1.D = 'SHADE' +f3d_mat.combiner1.A_alpha = '0' +f3d_mat.combiner1.B_alpha = '0' +f3d_mat.combiner1.C_alpha = '0' +f3d_mat.combiner1.D_alpha = 'SHADE' +f3d_mat.combiner2.name = '' +f3d_mat.combiner2.A = 'COMBINED' +f3d_mat.combiner2.B = '0' +f3d_mat.combiner2.C = 'PRIMITIVE' +f3d_mat.combiner2.D = '0' +f3d_mat.combiner2.A_alpha = 'COMBINED' +f3d_mat.combiner2.B_alpha = '0' +f3d_mat.combiner2.C_alpha = 'PRIMITIVE' +f3d_mat.combiner2.D_alpha = '0' +f3d_mat.tex0.name = '' +f3d_mat.tex0.tex_set = True +f3d_mat.tex1.name = '' +f3d_mat.tex1.tex_set = True +f3d_mat.set_prim = True +f3d_mat.set_lights = False +f3d_mat.set_env = True +f3d_mat.set_blend = False +f3d_mat.set_key = True +f3d_mat.set_k0_5 = True +f3d_mat.set_combiner = True +f3d_mat.use_default_lighting = True +f3d_mat.blend_color = (0.0, 0.0, 0.0, 1.0) +f3d_mat.prim_color = (1.0, 1.0, 1.0, 1.0) +f3d_mat.env_color = (1.0, 1.0, 1.0, 1.0) +f3d_mat.key_center = (0.5, 0.5, 0.5, 1.0) +f3d_mat.key_scale = (0.0, 0.0, 0.0) +f3d_mat.key_width = (0.0, 0.0, 0.0) +f3d_mat.k0 = 0.686274528503418 +f3d_mat.k1 = -0.16862745583057404 +f3d_mat.k2 = -0.3490196168422699 +f3d_mat.k3 = 0.8705882430076599 +f3d_mat.k4 = 0.4470588266849518 +f3d_mat.k5 = 0.16470588743686676 +f3d_mat.prim_lod_frac = 0.0 +f3d_mat.prim_lod_min = 0.0 +f3d_mat.default_light_color = (1.0, 1.0, 1.0, 1.0) +f3d_mat.set_ambient_from_light = True +f3d_mat.ambient_light_color = (0.2140410989522934, 0.2140410989522934, 0.2140410989522934, 1.0) +f3d_mat.f3d_light1 = None +f3d_mat.f3d_light2 = None +f3d_mat.f3d_light3 = None +f3d_mat.f3d_light4 = None +f3d_mat.f3d_light5 = None +f3d_mat.f3d_light6 = None +f3d_mat.f3d_light7 = None +f3d_mat.ao_ambient = 1.0 +f3d_mat.ao_directional = 0.625 +f3d_mat.ao_point = 0.0 +f3d_mat.set_ao = False +f3d_mat.fresnel_lo = 0.699999988079071 +f3d_mat.fresnel_hi = 0.20000000298023224 +f3d_mat.set_fresnel = True +f3d_mat.attroffs_st = (0.0, 0.0) +f3d_mat.attroffs_z = -2 +f3d_mat.set_attroffs_st = False +f3d_mat.set_attroffs_z = False +f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) +f3d_mat.fog_position = (985, 1000) +f3d_mat.set_fog = False +f3d_mat.use_global_fog = True +f3d_mat.rdp_settings.name = '' +f3d_mat.rdp_settings.g_zbuffer = True +f3d_mat.rdp_settings.g_shade = True +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False +f3d_mat.rdp_settings.g_cull_front = False +f3d_mat.rdp_settings.g_cull_back = True +f3d_mat.rdp_settings.g_packed_normals = True +f3d_mat.rdp_settings.g_lighttoalpha = False +f3d_mat.rdp_settings.g_lighting_specular = False +f3d_mat.rdp_settings.g_fresnel_color = False +f3d_mat.rdp_settings.g_fresnel_alpha = True +f3d_mat.rdp_settings.g_fog = False +f3d_mat.rdp_settings.g_lighting = True +f3d_mat.rdp_settings.g_tex_gen = False +f3d_mat.rdp_settings.g_tex_gen_linear = False +f3d_mat.rdp_settings.g_lod = False +f3d_mat.rdp_settings.g_shade_smooth = True +f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' +f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' +f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' +f3d_mat.rdp_settings.g_mdsft_textconv = 'G_TC_FILT' +f3d_mat.rdp_settings.g_mdsft_text_filt = 'G_TF_BILERP' +f3d_mat.rdp_settings.g_mdsft_textlut = 'G_TT_NONE' +f3d_mat.rdp_settings.g_mdsft_textlod = 'G_TL_TILE' +f3d_mat.rdp_settings.num_textures_mipmapped = 2 +f3d_mat.rdp_settings.g_mdsft_textdetail = 'G_TD_CLAMP' +f3d_mat.rdp_settings.g_mdsft_textpersp = 'G_TP_PERSP' +f3d_mat.rdp_settings.g_mdsft_cycletype = 'G_CYC_2CYCLE' +f3d_mat.rdp_settings.g_mdsft_color_dither = 'G_CD_ENABLE' +f3d_mat.rdp_settings.g_mdsft_pipeline = 'G_PM_NPRIMITIVE' +f3d_mat.rdp_settings.g_mdsft_alpha_compare = 'G_AC_NONE' +f3d_mat.rdp_settings.g_mdsft_zsrcsel = 'G_ZS_PIXEL' +f3d_mat.rdp_settings.prim_depth.name = '' +f3d_mat.rdp_settings.prim_depth.z = 0 +f3d_mat.rdp_settings.prim_depth.dz = 0 +f3d_mat.rdp_settings.clip_ratio = 1 +f3d_mat.rdp_settings.set_rendermode = True +f3d_mat.rdp_settings.rendermode_advanced_enabled = False +f3d_mat.rdp_settings.rendermode_preset_cycle_1 = 'G_RM_PASS' +f3d_mat.rdp_settings.rendermode_preset_cycle_2 = 'G_RM_AA_ZB_OPA_SURF2' +f3d_mat.rdp_settings.aa_en = False +f3d_mat.rdp_settings.z_cmp = False +f3d_mat.rdp_settings.z_upd = False +f3d_mat.rdp_settings.im_rd = False +f3d_mat.rdp_settings.clr_on_cvg = False +f3d_mat.rdp_settings.cvg_dst = 'CVG_DST_CLAMP' +f3d_mat.rdp_settings.zmode = 'ZMODE_OPA' +f3d_mat.rdp_settings.cvg_x_alpha = False +f3d_mat.rdp_settings.alpha_cvg_sel = False +f3d_mat.rdp_settings.force_bl = False +f3d_mat.rdp_settings.blend_p1 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_p2 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_m1 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_m2 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_a1 = 'G_BL_A_IN' +f3d_mat.rdp_settings.blend_a2 = 'G_BL_A_IN' +f3d_mat.rdp_settings.blend_b1 = 'G_BL_1MA' +f3d_mat.rdp_settings.blend_b2 = 'G_BL_1MA' +f3d_mat.draw_layer.name = '' +f3d_mat.draw_layer.sm64 = '1' +f3d_mat.draw_layer.oot = 'Opaque' +f3d_mat.large_edges = 'Clamp' +f3d_mat.expand_cel_shading_ui = False +f3d_mat.use_cel_shading = False +f3d_mat.cel_shading.name = '' +f3d_mat.cel_shading.tintPipeline = 'CC' +f3d_mat.cel_shading.cutoutSource = 'ENVIRONMENT' +f3d_mat.cel_shading.levels.clear() +bpy.context.material.f3d_update_flag = False +f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update +""" + +oot_ghost_texture_fresnel = """ +import bpy +f3d_mat = bpy.context.material.f3d_mat + +bpy.context.material.f3d_update_flag = True +f3d_mat.presetName = 'Oot Ghost Texture Fresnel' +f3d_mat.combiner1.name = '' +f3d_mat.combiner1.A = 'TEXEL0' +f3d_mat.combiner1.B = '0' +f3d_mat.combiner1.C = 'SHADE' +f3d_mat.combiner1.D = '0' +f3d_mat.combiner1.A_alpha = '0' +f3d_mat.combiner1.B_alpha = '0' +f3d_mat.combiner1.C_alpha = '0' +f3d_mat.combiner1.D_alpha = 'SHADE' +f3d_mat.combiner2.name = '' +f3d_mat.combiner2.A = 'COMBINED' +f3d_mat.combiner2.B = '0' +f3d_mat.combiner2.C = 'PRIMITIVE' +f3d_mat.combiner2.D = '0' +f3d_mat.combiner2.A_alpha = 'COMBINED' +f3d_mat.combiner2.B_alpha = '0' +f3d_mat.combiner2.C_alpha = 'PRIMITIVE' +f3d_mat.combiner2.D_alpha = '0' +f3d_mat.tex0.name = '' +f3d_mat.tex0.tex_set = True +f3d_mat.tex1.name = '' +f3d_mat.tex1.tex_set = True +f3d_mat.set_prim = True +f3d_mat.set_lights = False +f3d_mat.set_env = True +f3d_mat.set_blend = False +f3d_mat.set_key = True +f3d_mat.set_k0_5 = True +f3d_mat.set_combiner = True +f3d_mat.use_default_lighting = True +f3d_mat.blend_color = (0.0, 0.0, 0.0, 1.0) +f3d_mat.prim_color = (1.0, 1.0, 1.0, 1.0) +f3d_mat.env_color = (1.0, 1.0, 1.0, 1.0) +f3d_mat.key_center = (0.5, 0.5, 0.5, 1.0) +f3d_mat.key_scale = (0.0, 0.0, 0.0) +f3d_mat.key_width = (0.0, 0.0, 0.0) +f3d_mat.k0 = 0.686274528503418 +f3d_mat.k1 = -0.16862745583057404 +f3d_mat.k2 = -0.3490196168422699 +f3d_mat.k3 = 0.8705882430076599 +f3d_mat.k4 = 0.4470588266849518 +f3d_mat.k5 = 0.16470588743686676 +f3d_mat.prim_lod_frac = 0.0 +f3d_mat.prim_lod_min = 0.0 +f3d_mat.default_light_color = (1.0, 1.0, 1.0, 1.0) +f3d_mat.set_ambient_from_light = True +f3d_mat.ambient_light_color = (0.2140410989522934, 0.2140410989522934, 0.2140410989522934, 1.0) +f3d_mat.f3d_light1 = None +f3d_mat.f3d_light2 = None +f3d_mat.f3d_light3 = None +f3d_mat.f3d_light4 = None +f3d_mat.f3d_light5 = None +f3d_mat.f3d_light6 = None +f3d_mat.f3d_light7 = None +f3d_mat.ao_ambient = 1.0 +f3d_mat.ao_directional = 0.625 +f3d_mat.ao_point = 0.0 +f3d_mat.set_ao = False +f3d_mat.fresnel_lo = 0.699999988079071 +f3d_mat.fresnel_hi = 0.20000000298023224 +f3d_mat.set_fresnel = True +f3d_mat.attroffs_st = (0.0, 0.0) +f3d_mat.attroffs_z = -2 +f3d_mat.set_attroffs_st = False +f3d_mat.set_attroffs_z = False +f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) +f3d_mat.fog_position = (985, 1000) +f3d_mat.set_fog = False +f3d_mat.use_global_fog = True +f3d_mat.rdp_settings.name = '' +f3d_mat.rdp_settings.g_zbuffer = True +f3d_mat.rdp_settings.g_shade = True +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False +f3d_mat.rdp_settings.g_cull_front = False +f3d_mat.rdp_settings.g_cull_back = True +f3d_mat.rdp_settings.g_packed_normals = True +f3d_mat.rdp_settings.g_lighttoalpha = False +f3d_mat.rdp_settings.g_lighting_specular = False +f3d_mat.rdp_settings.g_fresnel_color = False +f3d_mat.rdp_settings.g_fresnel_alpha = True +f3d_mat.rdp_settings.g_fog = False +f3d_mat.rdp_settings.g_lighting = True +f3d_mat.rdp_settings.g_tex_gen = False +f3d_mat.rdp_settings.g_tex_gen_linear = False +f3d_mat.rdp_settings.g_lod = False +f3d_mat.rdp_settings.g_shade_smooth = True +f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' +f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' +f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' +f3d_mat.rdp_settings.g_mdsft_textconv = 'G_TC_FILT' +f3d_mat.rdp_settings.g_mdsft_text_filt = 'G_TF_BILERP' +f3d_mat.rdp_settings.g_mdsft_textlut = 'G_TT_NONE' +f3d_mat.rdp_settings.g_mdsft_textlod = 'G_TL_TILE' +f3d_mat.rdp_settings.num_textures_mipmapped = 2 +f3d_mat.rdp_settings.g_mdsft_textdetail = 'G_TD_CLAMP' +f3d_mat.rdp_settings.g_mdsft_textpersp = 'G_TP_PERSP' +f3d_mat.rdp_settings.g_mdsft_cycletype = 'G_CYC_2CYCLE' +f3d_mat.rdp_settings.g_mdsft_color_dither = 'G_CD_ENABLE' +f3d_mat.rdp_settings.g_mdsft_pipeline = 'G_PM_NPRIMITIVE' +f3d_mat.rdp_settings.g_mdsft_alpha_compare = 'G_AC_NONE' +f3d_mat.rdp_settings.g_mdsft_zsrcsel = 'G_ZS_PIXEL' +f3d_mat.rdp_settings.prim_depth.name = '' +f3d_mat.rdp_settings.prim_depth.z = 0 +f3d_mat.rdp_settings.prim_depth.dz = 0 +f3d_mat.rdp_settings.clip_ratio = 1 +f3d_mat.rdp_settings.set_rendermode = True +f3d_mat.rdp_settings.rendermode_advanced_enabled = False +f3d_mat.rdp_settings.rendermode_preset_cycle_1 = 'G_RM_PASS' +f3d_mat.rdp_settings.rendermode_preset_cycle_2 = 'G_RM_AA_ZB_OPA_SURF2' +f3d_mat.rdp_settings.aa_en = False +f3d_mat.rdp_settings.z_cmp = False +f3d_mat.rdp_settings.z_upd = False +f3d_mat.rdp_settings.im_rd = False +f3d_mat.rdp_settings.clr_on_cvg = False +f3d_mat.rdp_settings.cvg_dst = 'CVG_DST_CLAMP' +f3d_mat.rdp_settings.zmode = 'ZMODE_OPA' +f3d_mat.rdp_settings.cvg_x_alpha = False +f3d_mat.rdp_settings.alpha_cvg_sel = False +f3d_mat.rdp_settings.force_bl = False +f3d_mat.rdp_settings.blend_p1 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_p2 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_m1 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_m2 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_a1 = 'G_BL_A_IN' +f3d_mat.rdp_settings.blend_a2 = 'G_BL_A_IN' +f3d_mat.rdp_settings.blend_b1 = 'G_BL_1MA' +f3d_mat.rdp_settings.blend_b2 = 'G_BL_1MA' +f3d_mat.draw_layer.name = '' +f3d_mat.draw_layer.sm64 = '1' +f3d_mat.draw_layer.oot = 'Opaque' +f3d_mat.large_edges = 'Clamp' +f3d_mat.expand_cel_shading_ui = False +f3d_mat.use_cel_shading = False +f3d_mat.cel_shading.name = '' +f3d_mat.cel_shading.tintPipeline = 'CC' +f3d_mat.cel_shading.cutoutSource = 'ENVIRONMENT' +f3d_mat.cel_shading.levels.clear() +bpy.context.material.f3d_update_flag = False +f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update +""" + +oot_glass_specular_fresnel = """ +import bpy +f3d_mat = bpy.context.material.f3d_mat + +bpy.context.material.f3d_update_flag = True +f3d_mat.presetName = 'Oot Glass Specular Fresnel' +f3d_mat.combiner1.name = '' +f3d_mat.combiner1.A = '0' +f3d_mat.combiner1.B = '0' +f3d_mat.combiner1.C = '0' +f3d_mat.combiner1.D = 'SHADE' +f3d_mat.combiner1.A_alpha = '0' +f3d_mat.combiner1.B_alpha = '0' +f3d_mat.combiner1.C_alpha = '0' +f3d_mat.combiner1.D_alpha = 'SHADE' +f3d_mat.combiner2.name = '' +f3d_mat.combiner2.A = 'COMBINED' +f3d_mat.combiner2.B = '0' +f3d_mat.combiner2.C = 'PRIMITIVE' +f3d_mat.combiner2.D = '0' +f3d_mat.combiner2.A_alpha = 'COMBINED' +f3d_mat.combiner2.B_alpha = '0' +f3d_mat.combiner2.C_alpha = 'PRIMITIVE' +f3d_mat.combiner2.D_alpha = '0' +f3d_mat.tex0.name = '' +f3d_mat.tex0.tex_set = True +f3d_mat.tex1.name = '' +f3d_mat.tex1.tex_set = True +f3d_mat.set_prim = True +f3d_mat.set_lights = False +f3d_mat.set_env = True +f3d_mat.set_blend = False +f3d_mat.set_key = True +f3d_mat.set_k0_5 = True +f3d_mat.set_combiner = True +f3d_mat.use_default_lighting = True +f3d_mat.blend_color = (0.0, 0.0, 0.0, 1.0) +f3d_mat.prim_color = (1.0, 1.0, 1.0, 1.0) +f3d_mat.env_color = (1.0, 1.0, 1.0, 1.0) +f3d_mat.key_center = (0.5, 0.5, 0.5, 1.0) +f3d_mat.key_scale = (0.0, 0.0, 0.0) +f3d_mat.key_width = (0.0, 0.0, 0.0) +f3d_mat.k0 = 0.686274528503418 +f3d_mat.k1 = -0.16862745583057404 +f3d_mat.k2 = -0.3490196168422699 +f3d_mat.k3 = 0.8705882430076599 +f3d_mat.k4 = 0.4470588266849518 +f3d_mat.k5 = 0.16470588743686676 +f3d_mat.prim_lod_frac = 0.0 +f3d_mat.prim_lod_min = 0.0 +f3d_mat.default_light_color = (1.0, 1.0, 1.0, 1.0) +f3d_mat.set_ambient_from_light = True +f3d_mat.ambient_light_color = (0.2140410989522934, 0.2140410989522934, 0.2140410989522934, 1.0) +f3d_mat.f3d_light1 = None +f3d_mat.f3d_light2 = None +f3d_mat.f3d_light3 = None +f3d_mat.f3d_light4 = None +f3d_mat.f3d_light5 = None +f3d_mat.f3d_light6 = None +f3d_mat.f3d_light7 = None +f3d_mat.ao_ambient = 1.0 +f3d_mat.ao_directional = 0.625 +f3d_mat.ao_point = 0.0 +f3d_mat.set_ao = False +f3d_mat.fresnel_lo = 0.699999988079071 +f3d_mat.fresnel_hi = 0.20000000298023224 +f3d_mat.set_fresnel = True +f3d_mat.attroffs_st = (0.0, 0.0) +f3d_mat.attroffs_z = -2 +f3d_mat.set_attroffs_st = False +f3d_mat.set_attroffs_z = False +f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) +f3d_mat.fog_position = (985, 1000) +f3d_mat.set_fog = False +f3d_mat.use_global_fog = True +f3d_mat.rdp_settings.name = '' +f3d_mat.rdp_settings.g_zbuffer = True +f3d_mat.rdp_settings.g_shade = True +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False +f3d_mat.rdp_settings.g_cull_front = False +f3d_mat.rdp_settings.g_cull_back = True +f3d_mat.rdp_settings.g_packed_normals = True +f3d_mat.rdp_settings.g_lighttoalpha = False +f3d_mat.rdp_settings.g_lighting_specular = True +f3d_mat.rdp_settings.g_fresnel_color = False +f3d_mat.rdp_settings.g_fresnel_alpha = True +f3d_mat.rdp_settings.g_fog = False +f3d_mat.rdp_settings.g_lighting = True +f3d_mat.rdp_settings.g_tex_gen = False +f3d_mat.rdp_settings.g_tex_gen_linear = False +f3d_mat.rdp_settings.g_lod = False +f3d_mat.rdp_settings.g_shade_smooth = True +f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' +f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' +f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' +f3d_mat.rdp_settings.g_mdsft_textconv = 'G_TC_FILT' +f3d_mat.rdp_settings.g_mdsft_text_filt = 'G_TF_BILERP' +f3d_mat.rdp_settings.g_mdsft_textlut = 'G_TT_NONE' +f3d_mat.rdp_settings.g_mdsft_textlod = 'G_TL_TILE' +f3d_mat.rdp_settings.num_textures_mipmapped = 2 +f3d_mat.rdp_settings.g_mdsft_textdetail = 'G_TD_CLAMP' +f3d_mat.rdp_settings.g_mdsft_textpersp = 'G_TP_PERSP' +f3d_mat.rdp_settings.g_mdsft_cycletype = 'G_CYC_2CYCLE' +f3d_mat.rdp_settings.g_mdsft_color_dither = 'G_CD_ENABLE' +f3d_mat.rdp_settings.g_mdsft_pipeline = 'G_PM_NPRIMITIVE' +f3d_mat.rdp_settings.g_mdsft_alpha_compare = 'G_AC_NONE' +f3d_mat.rdp_settings.g_mdsft_zsrcsel = 'G_ZS_PIXEL' +f3d_mat.rdp_settings.prim_depth.name = '' +f3d_mat.rdp_settings.prim_depth.z = 0 +f3d_mat.rdp_settings.prim_depth.dz = 0 +f3d_mat.rdp_settings.clip_ratio = 1 +f3d_mat.rdp_settings.set_rendermode = True +f3d_mat.rdp_settings.rendermode_advanced_enabled = False +f3d_mat.rdp_settings.rendermode_preset_cycle_1 = 'G_RM_PASS' +f3d_mat.rdp_settings.rendermode_preset_cycle_2 = 'G_RM_AA_ZB_OPA_SURF2' +f3d_mat.rdp_settings.aa_en = False +f3d_mat.rdp_settings.z_cmp = False +f3d_mat.rdp_settings.z_upd = False +f3d_mat.rdp_settings.im_rd = False +f3d_mat.rdp_settings.clr_on_cvg = False +f3d_mat.rdp_settings.cvg_dst = 'CVG_DST_CLAMP' +f3d_mat.rdp_settings.zmode = 'ZMODE_OPA' +f3d_mat.rdp_settings.cvg_x_alpha = False +f3d_mat.rdp_settings.alpha_cvg_sel = False +f3d_mat.rdp_settings.force_bl = False +f3d_mat.rdp_settings.blend_p1 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_p2 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_m1 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_m2 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_a1 = 'G_BL_A_IN' +f3d_mat.rdp_settings.blend_a2 = 'G_BL_A_IN' +f3d_mat.rdp_settings.blend_b1 = 'G_BL_1MA' +f3d_mat.rdp_settings.blend_b2 = 'G_BL_1MA' +f3d_mat.draw_layer.name = '' +f3d_mat.draw_layer.sm64 = '1' +f3d_mat.draw_layer.oot = 'Opaque' +f3d_mat.large_edges = 'Clamp' +f3d_mat.expand_cel_shading_ui = False +f3d_mat.use_cel_shading = False +f3d_mat.cel_shading.name = '' +f3d_mat.cel_shading.tintPipeline = 'CC' +f3d_mat.cel_shading.cutoutSource = 'ENVIRONMENT' +f3d_mat.cel_shading.levels.clear() +bpy.context.material.f3d_update_flag = False +f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update +""" + +oot_shaded_solid_ao = """ +import bpy +f3d_mat = bpy.context.material.f3d_mat + +bpy.context.material.f3d_update_flag = True +f3d_mat.presetName = 'Oot Shaded Solid Ao' +f3d_mat.combiner1.name = '' +f3d_mat.combiner1.A = '0' +f3d_mat.combiner1.B = '0' +f3d_mat.combiner1.C = '0' +f3d_mat.combiner1.D = 'SHADE' +f3d_mat.combiner1.A_alpha = '0' +f3d_mat.combiner1.B_alpha = '0' +f3d_mat.combiner1.C_alpha = '0' +f3d_mat.combiner1.D_alpha = '1' +f3d_mat.combiner2.name = '' +f3d_mat.combiner2.A = 'COMBINED' +f3d_mat.combiner2.B = '0' +f3d_mat.combiner2.C = 'PRIMITIVE' +f3d_mat.combiner2.D = '0' +f3d_mat.combiner2.A_alpha = '0' +f3d_mat.combiner2.B_alpha = '0' +f3d_mat.combiner2.C_alpha = '0' +f3d_mat.combiner2.D_alpha = 'COMBINED' +f3d_mat.tex0.name = '' +f3d_mat.tex0.tex_set = True +f3d_mat.tex1.name = '' +f3d_mat.tex1.tex_set = True +f3d_mat.set_prim = True +f3d_mat.set_lights = False +f3d_mat.set_env = True +f3d_mat.set_blend = False +f3d_mat.set_key = True +f3d_mat.set_k0_5 = True +f3d_mat.set_combiner = True +f3d_mat.use_default_lighting = True +f3d_mat.blend_color = (0.0, 0.0, 0.0, 1.0) +f3d_mat.prim_color = (1.0, 1.0, 1.0, 1.0) +f3d_mat.env_color = (1.0, 1.0, 1.0, 1.0) +f3d_mat.key_center = (0.5, 0.5, 0.5, 1.0) +f3d_mat.key_scale = (0.0, 0.0, 0.0) +f3d_mat.key_width = (0.0, 0.0, 0.0) +f3d_mat.k0 = 0.686274528503418 +f3d_mat.k1 = -0.16862745583057404 +f3d_mat.k2 = -0.3490196168422699 +f3d_mat.k3 = 0.8705882430076599 +f3d_mat.k4 = 0.4470588266849518 +f3d_mat.k5 = 0.16470588743686676 +f3d_mat.prim_lod_frac = 0.0 +f3d_mat.prim_lod_min = 0.0 +f3d_mat.default_light_color = (1.0, 1.0, 1.0, 1.0) +f3d_mat.set_ambient_from_light = True +f3d_mat.ambient_light_color = (0.2140410989522934, 0.2140410989522934, 0.2140410989522934, 1.0) +f3d_mat.f3d_light1 = None +f3d_mat.f3d_light2 = None +f3d_mat.f3d_light3 = None +f3d_mat.f3d_light4 = None +f3d_mat.f3d_light5 = None +f3d_mat.f3d_light6 = None +f3d_mat.f3d_light7 = None +f3d_mat.ao_ambient = 1.0 +f3d_mat.ao_directional = 0.625 +f3d_mat.ao_point = 0.0 +f3d_mat.set_ao = False +f3d_mat.fresnel_lo = 0.699999988079071 +f3d_mat.fresnel_hi = 0.4000000059604645 +f3d_mat.set_fresnel = False +f3d_mat.attroffs_st = (0.0, 0.0) +f3d_mat.attroffs_z = -2 +f3d_mat.set_attroffs_st = False +f3d_mat.set_attroffs_z = False +f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) +f3d_mat.fog_position = (985, 1000) +f3d_mat.set_fog = False +f3d_mat.use_global_fog = True +f3d_mat.rdp_settings.name = '' +f3d_mat.rdp_settings.g_zbuffer = True +f3d_mat.rdp_settings.g_shade = True +f3d_mat.rdp_settings.g_ambocclusion = True +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False +f3d_mat.rdp_settings.g_cull_front = False +f3d_mat.rdp_settings.g_cull_back = True +f3d_mat.rdp_settings.g_packed_normals = False +f3d_mat.rdp_settings.g_lighttoalpha = False +f3d_mat.rdp_settings.g_lighting_specular = False +f3d_mat.rdp_settings.g_fresnel_color = False +f3d_mat.rdp_settings.g_fresnel_alpha = False +f3d_mat.rdp_settings.g_fog = True +f3d_mat.rdp_settings.g_lighting = True +f3d_mat.rdp_settings.g_tex_gen = False +f3d_mat.rdp_settings.g_tex_gen_linear = False +f3d_mat.rdp_settings.g_lod = False +f3d_mat.rdp_settings.g_shade_smooth = True +f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' +f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' +f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' +f3d_mat.rdp_settings.g_mdsft_textconv = 'G_TC_FILT' +f3d_mat.rdp_settings.g_mdsft_text_filt = 'G_TF_BILERP' +f3d_mat.rdp_settings.g_mdsft_textlut = 'G_TT_NONE' +f3d_mat.rdp_settings.g_mdsft_textlod = 'G_TL_TILE' +f3d_mat.rdp_settings.num_textures_mipmapped = 2 +f3d_mat.rdp_settings.g_mdsft_textdetail = 'G_TD_CLAMP' +f3d_mat.rdp_settings.g_mdsft_textpersp = 'G_TP_PERSP' +f3d_mat.rdp_settings.g_mdsft_cycletype = 'G_CYC_2CYCLE' +f3d_mat.rdp_settings.g_mdsft_color_dither = 'G_CD_ENABLE' +f3d_mat.rdp_settings.g_mdsft_pipeline = 'G_PM_NPRIMITIVE' +f3d_mat.rdp_settings.g_mdsft_alpha_compare = 'G_AC_NONE' +f3d_mat.rdp_settings.g_mdsft_zsrcsel = 'G_ZS_PIXEL' +f3d_mat.rdp_settings.prim_depth.name = '' +f3d_mat.rdp_settings.prim_depth.z = 0 +f3d_mat.rdp_settings.prim_depth.dz = 0 +f3d_mat.rdp_settings.clip_ratio = 1 +f3d_mat.rdp_settings.set_rendermode = True +f3d_mat.rdp_settings.rendermode_advanced_enabled = False +f3d_mat.rdp_settings.rendermode_preset_cycle_1 = 'G_RM_FOG_SHADE_A' +f3d_mat.rdp_settings.rendermode_preset_cycle_2 = 'G_RM_AA_ZB_OPA_SURF2' +f3d_mat.rdp_settings.aa_en = False +f3d_mat.rdp_settings.z_cmp = False +f3d_mat.rdp_settings.z_upd = False +f3d_mat.rdp_settings.im_rd = False +f3d_mat.rdp_settings.clr_on_cvg = False +f3d_mat.rdp_settings.cvg_dst = 'CVG_DST_CLAMP' +f3d_mat.rdp_settings.zmode = 'ZMODE_OPA' +f3d_mat.rdp_settings.cvg_x_alpha = False +f3d_mat.rdp_settings.alpha_cvg_sel = False +f3d_mat.rdp_settings.force_bl = False +f3d_mat.rdp_settings.blend_p1 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_p2 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_m1 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_m2 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_a1 = 'G_BL_A_IN' +f3d_mat.rdp_settings.blend_a2 = 'G_BL_A_IN' +f3d_mat.rdp_settings.blend_b1 = 'G_BL_1MA' +f3d_mat.rdp_settings.blend_b2 = 'G_BL_1MA' +f3d_mat.draw_layer.name = '' +f3d_mat.draw_layer.sm64 = '1' +f3d_mat.draw_layer.oot = 'Opaque' +f3d_mat.large_edges = 'Clamp' +f3d_mat.expand_cel_shading_ui = False +f3d_mat.use_cel_shading = False +f3d_mat.cel_shading.name = '' +f3d_mat.cel_shading.tintPipeline = 'CC' +f3d_mat.cel_shading.cutoutSource = 'ENVIRONMENT' +f3d_mat.cel_shading.levels.clear() +bpy.context.material.f3d_update_flag = False +f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update +""" + +oot_shaded_solid_ao_transparent = """ +import bpy +f3d_mat = bpy.context.material.f3d_mat + +bpy.context.material.f3d_update_flag = True +f3d_mat.presetName = 'Oot Shaded Solid Ao Transparent' +f3d_mat.combiner1.name = '' +f3d_mat.combiner1.A = '0' +f3d_mat.combiner1.B = '0' +f3d_mat.combiner1.C = '0' +f3d_mat.combiner1.D = 'SHADE' +f3d_mat.combiner1.A_alpha = '0' +f3d_mat.combiner1.B_alpha = '0' +f3d_mat.combiner1.C_alpha = '0' +f3d_mat.combiner1.D_alpha = '1' +f3d_mat.combiner2.name = '' +f3d_mat.combiner2.A = 'COMBINED' +f3d_mat.combiner2.B = '0' +f3d_mat.combiner2.C = 'PRIMITIVE' +f3d_mat.combiner2.D = '0' +f3d_mat.combiner2.A_alpha = 'COMBINED' +f3d_mat.combiner2.B_alpha = '0' +f3d_mat.combiner2.C_alpha = 'PRIMITIVE' +f3d_mat.combiner2.D_alpha = '0' +f3d_mat.tex0.name = '' +f3d_mat.tex0.tex_set = True +f3d_mat.tex1.name = '' +f3d_mat.tex1.tex_set = True +f3d_mat.set_prim = True +f3d_mat.set_lights = False +f3d_mat.set_env = True +f3d_mat.set_blend = False +f3d_mat.set_key = True +f3d_mat.set_k0_5 = True +f3d_mat.set_combiner = True +f3d_mat.use_default_lighting = True +f3d_mat.blend_color = (0.0, 0.0, 0.0, 1.0) +f3d_mat.prim_color = (1.0, 1.0, 1.0, 0.5) +f3d_mat.env_color = (1.0, 1.0, 1.0, 1.0) +f3d_mat.key_center = (0.5, 0.5, 0.5, 1.0) +f3d_mat.key_scale = (0.0, 0.0, 0.0) +f3d_mat.key_width = (0.0, 0.0, 0.0) +f3d_mat.k0 = 0.686274528503418 +f3d_mat.k1 = -0.16862745583057404 +f3d_mat.k2 = -0.3490196168422699 +f3d_mat.k3 = 0.8705882430076599 +f3d_mat.k4 = 0.4470588266849518 +f3d_mat.k5 = 0.16470588743686676 +f3d_mat.prim_lod_frac = 0.0 +f3d_mat.prim_lod_min = 0.0 +f3d_mat.default_light_color = (1.0, 1.0, 1.0, 1.0) +f3d_mat.set_ambient_from_light = True +f3d_mat.ambient_light_color = (0.2140410989522934, 0.2140410989522934, 0.2140410989522934, 1.0) +f3d_mat.f3d_light1 = None +f3d_mat.f3d_light2 = None +f3d_mat.f3d_light3 = None +f3d_mat.f3d_light4 = None +f3d_mat.f3d_light5 = None +f3d_mat.f3d_light6 = None +f3d_mat.f3d_light7 = None +f3d_mat.ao_ambient = 1.0 +f3d_mat.ao_directional = 0.625 +f3d_mat.ao_point = 0.0 +f3d_mat.set_ao = False +f3d_mat.fresnel_lo = 0.699999988079071 +f3d_mat.fresnel_hi = 0.4000000059604645 +f3d_mat.set_fresnel = False +f3d_mat.attroffs_st = (0.0, 0.0) +f3d_mat.attroffs_z = -2 +f3d_mat.set_attroffs_st = False +f3d_mat.set_attroffs_z = False +f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) +f3d_mat.fog_position = (985, 1000) +f3d_mat.set_fog = False +f3d_mat.use_global_fog = True +f3d_mat.rdp_settings.name = '' +f3d_mat.rdp_settings.g_zbuffer = True +f3d_mat.rdp_settings.g_shade = True +f3d_mat.rdp_settings.g_ambocclusion = True +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False +f3d_mat.rdp_settings.g_cull_front = False +f3d_mat.rdp_settings.g_cull_back = False +f3d_mat.rdp_settings.g_packed_normals = False +f3d_mat.rdp_settings.g_lighttoalpha = False +f3d_mat.rdp_settings.g_lighting_specular = False +f3d_mat.rdp_settings.g_fresnel_color = False +f3d_mat.rdp_settings.g_fresnel_alpha = False +f3d_mat.rdp_settings.g_fog = True +f3d_mat.rdp_settings.g_lighting = True +f3d_mat.rdp_settings.g_tex_gen = False +f3d_mat.rdp_settings.g_tex_gen_linear = False +f3d_mat.rdp_settings.g_lod = False +f3d_mat.rdp_settings.g_shade_smooth = True +f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' +f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' +f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' +f3d_mat.rdp_settings.g_mdsft_textconv = 'G_TC_FILT' +f3d_mat.rdp_settings.g_mdsft_text_filt = 'G_TF_BILERP' +f3d_mat.rdp_settings.g_mdsft_textlut = 'G_TT_NONE' +f3d_mat.rdp_settings.g_mdsft_textlod = 'G_TL_TILE' +f3d_mat.rdp_settings.num_textures_mipmapped = 2 +f3d_mat.rdp_settings.g_mdsft_textdetail = 'G_TD_CLAMP' +f3d_mat.rdp_settings.g_mdsft_textpersp = 'G_TP_PERSP' +f3d_mat.rdp_settings.g_mdsft_cycletype = 'G_CYC_2CYCLE' +f3d_mat.rdp_settings.g_mdsft_color_dither = 'G_CD_ENABLE' +f3d_mat.rdp_settings.g_mdsft_pipeline = 'G_PM_NPRIMITIVE' +f3d_mat.rdp_settings.g_mdsft_alpha_compare = 'G_AC_NONE' +f3d_mat.rdp_settings.g_mdsft_zsrcsel = 'G_ZS_PIXEL' +f3d_mat.rdp_settings.prim_depth.name = '' +f3d_mat.rdp_settings.prim_depth.z = 0 +f3d_mat.rdp_settings.prim_depth.dz = 0 +f3d_mat.rdp_settings.clip_ratio = 1 +f3d_mat.rdp_settings.set_rendermode = True +f3d_mat.rdp_settings.rendermode_advanced_enabled = False +f3d_mat.rdp_settings.rendermode_preset_cycle_1 = 'G_RM_FOG_SHADE_A' +f3d_mat.rdp_settings.rendermode_preset_cycle_2 = 'G_RM_AA_ZB_XLU_SURF2' +f3d_mat.rdp_settings.aa_en = False +f3d_mat.rdp_settings.z_cmp = False +f3d_mat.rdp_settings.z_upd = False +f3d_mat.rdp_settings.im_rd = False +f3d_mat.rdp_settings.clr_on_cvg = False +f3d_mat.rdp_settings.cvg_dst = 'CVG_DST_CLAMP' +f3d_mat.rdp_settings.zmode = 'ZMODE_OPA' +f3d_mat.rdp_settings.cvg_x_alpha = False +f3d_mat.rdp_settings.alpha_cvg_sel = False +f3d_mat.rdp_settings.force_bl = False +f3d_mat.rdp_settings.blend_p1 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_p2 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_m1 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_m2 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_a1 = 'G_BL_A_IN' +f3d_mat.rdp_settings.blend_a2 = 'G_BL_A_IN' +f3d_mat.rdp_settings.blend_b1 = 'G_BL_1MA' +f3d_mat.rdp_settings.blend_b2 = 'G_BL_1MA' +f3d_mat.draw_layer.name = '' +f3d_mat.draw_layer.sm64 = '5' +f3d_mat.draw_layer.oot = 'Transparent' +f3d_mat.large_edges = 'Clamp' +f3d_mat.expand_cel_shading_ui = False +f3d_mat.use_cel_shading = False +f3d_mat.cel_shading.name = '' +f3d_mat.cel_shading.tintPipeline = 'CC' +f3d_mat.cel_shading.cutoutSource = 'ENVIRONMENT' +f3d_mat.cel_shading.levels.clear() +bpy.context.material.f3d_update_flag = False +f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update +""" + +oot_shaded_specular_vcol_texture = """ +import bpy +f3d_mat = bpy.context.material.f3d_mat + +bpy.context.material.f3d_update_flag = True +f3d_mat.presetName = 'Oot Shaded Specular Vcol Texture' +f3d_mat.combiner1.name = '' +f3d_mat.combiner1.A = 'TEXEL0' +f3d_mat.combiner1.B = '0' +f3d_mat.combiner1.C = 'SHADE' +f3d_mat.combiner1.D = '0' +f3d_mat.combiner1.A_alpha = '0' +f3d_mat.combiner1.B_alpha = '0' +f3d_mat.combiner1.C_alpha = '0' +f3d_mat.combiner1.D_alpha = '1' +f3d_mat.combiner2.name = '' +f3d_mat.combiner2.A = 'COMBINED' +f3d_mat.combiner2.B = '0' +f3d_mat.combiner2.C = 'PRIMITIVE' +f3d_mat.combiner2.D = '0' +f3d_mat.combiner2.A_alpha = '0' +f3d_mat.combiner2.B_alpha = '0' +f3d_mat.combiner2.C_alpha = '0' +f3d_mat.combiner2.D_alpha = 'COMBINED' +f3d_mat.tex0.name = '' +f3d_mat.tex0.tex_set = True +f3d_mat.tex1.name = '' +f3d_mat.tex1.tex_set = True +f3d_mat.set_prim = True +f3d_mat.set_lights = False +f3d_mat.set_env = False +f3d_mat.set_blend = False +f3d_mat.set_key = True +f3d_mat.set_k0_5 = True +f3d_mat.set_combiner = True +f3d_mat.use_default_lighting = True +f3d_mat.blend_color = (0.0, 0.0, 0.0, 1.0) +f3d_mat.prim_color = (1.0, 1.0, 1.0, 1.0) +f3d_mat.env_color = (0.0, 0.0, 0.0, 1.0) +f3d_mat.key_center = (0.5, 0.5, 0.5, 1.0) +f3d_mat.key_scale = (0.0, 0.0, 0.0) +f3d_mat.key_width = (0.0, 0.0, 0.0) +f3d_mat.k0 = 0.686274528503418 +f3d_mat.k1 = -0.16862745583057404 +f3d_mat.k2 = -0.3490196168422699 +f3d_mat.k3 = 0.8705882430076599 +f3d_mat.k4 = 0.4470588266849518 +f3d_mat.k5 = 0.16470588743686676 +f3d_mat.prim_lod_frac = 0.0 +f3d_mat.prim_lod_min = 0.0 +f3d_mat.default_light_color = (1.0, 1.0, 1.0, 1.0) +f3d_mat.set_ambient_from_light = True +f3d_mat.ambient_light_color = (0.2140410989522934, 0.2140410989522934, 0.2140410989522934, 1.0) +f3d_mat.f3d_light1 = None +f3d_mat.f3d_light2 = None +f3d_mat.f3d_light3 = None +f3d_mat.f3d_light4 = None +f3d_mat.f3d_light5 = None +f3d_mat.f3d_light6 = None +f3d_mat.f3d_light7 = None +f3d_mat.ao_ambient = 1.0 +f3d_mat.ao_directional = 0.625 +f3d_mat.ao_point = 0.0 +f3d_mat.set_ao = False +f3d_mat.fresnel_lo = 0.699999988079071 +f3d_mat.fresnel_hi = 0.4000000059604645 +f3d_mat.set_fresnel = False +f3d_mat.attroffs_st = (0.0, 0.0) +f3d_mat.attroffs_z = -2 +f3d_mat.set_attroffs_st = False +f3d_mat.set_attroffs_z = False +f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) +f3d_mat.fog_position = (985, 1000) +f3d_mat.set_fog = False +f3d_mat.use_global_fog = True +f3d_mat.rdp_settings.name = '' +f3d_mat.rdp_settings.g_zbuffer = True +f3d_mat.rdp_settings.g_shade = True +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False +f3d_mat.rdp_settings.g_cull_front = False +f3d_mat.rdp_settings.g_cull_back = True +f3d_mat.rdp_settings.g_packed_normals = True +f3d_mat.rdp_settings.g_lighttoalpha = False +f3d_mat.rdp_settings.g_lighting_specular = True +f3d_mat.rdp_settings.g_fresnel_color = False +f3d_mat.rdp_settings.g_fresnel_alpha = False +f3d_mat.rdp_settings.g_fog = True +f3d_mat.rdp_settings.g_lighting = True +f3d_mat.rdp_settings.g_tex_gen = False +f3d_mat.rdp_settings.g_tex_gen_linear = False +f3d_mat.rdp_settings.g_lod = False +f3d_mat.rdp_settings.g_shade_smooth = True +f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' +f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' +f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' +f3d_mat.rdp_settings.g_mdsft_textconv = 'G_TC_FILT' +f3d_mat.rdp_settings.g_mdsft_text_filt = 'G_TF_BILERP' +f3d_mat.rdp_settings.g_mdsft_textlut = 'G_TT_NONE' +f3d_mat.rdp_settings.g_mdsft_textlod = 'G_TL_TILE' +f3d_mat.rdp_settings.num_textures_mipmapped = 2 +f3d_mat.rdp_settings.g_mdsft_textdetail = 'G_TD_CLAMP' +f3d_mat.rdp_settings.g_mdsft_textpersp = 'G_TP_PERSP' +f3d_mat.rdp_settings.g_mdsft_cycletype = 'G_CYC_2CYCLE' +f3d_mat.rdp_settings.g_mdsft_color_dither = 'G_CD_ENABLE' +f3d_mat.rdp_settings.g_mdsft_pipeline = 'G_PM_NPRIMITIVE' +f3d_mat.rdp_settings.g_mdsft_alpha_compare = 'G_AC_NONE' +f3d_mat.rdp_settings.g_mdsft_zsrcsel = 'G_ZS_PIXEL' +f3d_mat.rdp_settings.prim_depth.name = '' +f3d_mat.rdp_settings.prim_depth.z = 0 +f3d_mat.rdp_settings.prim_depth.dz = 0 +f3d_mat.rdp_settings.clip_ratio = 1 +f3d_mat.rdp_settings.set_rendermode = True +f3d_mat.rdp_settings.rendermode_advanced_enabled = False +f3d_mat.rdp_settings.rendermode_preset_cycle_1 = 'G_RM_FOG_SHADE_A' +f3d_mat.rdp_settings.rendermode_preset_cycle_2 = 'G_RM_AA_ZB_OPA_SURF2' +f3d_mat.rdp_settings.aa_en = False +f3d_mat.rdp_settings.z_cmp = False +f3d_mat.rdp_settings.z_upd = False +f3d_mat.rdp_settings.im_rd = False +f3d_mat.rdp_settings.clr_on_cvg = False +f3d_mat.rdp_settings.cvg_dst = 'CVG_DST_CLAMP' +f3d_mat.rdp_settings.zmode = 'ZMODE_OPA' +f3d_mat.rdp_settings.cvg_x_alpha = False +f3d_mat.rdp_settings.alpha_cvg_sel = False +f3d_mat.rdp_settings.force_bl = False +f3d_mat.rdp_settings.blend_p1 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_p2 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_m1 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_m2 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_a1 = 'G_BL_A_IN' +f3d_mat.rdp_settings.blend_a2 = 'G_BL_A_IN' +f3d_mat.rdp_settings.blend_b1 = 'G_BL_1MA' +f3d_mat.rdp_settings.blend_b2 = 'G_BL_1MA' +f3d_mat.draw_layer.name = '' +f3d_mat.draw_layer.sm64 = '1' +f3d_mat.draw_layer.oot = 'Opaque' +f3d_mat.large_edges = 'Clamp' +f3d_mat.expand_cel_shading_ui = False +f3d_mat.use_cel_shading = False +f3d_mat.cel_shading.name = '' +f3d_mat.cel_shading.tintPipeline = 'CC' +f3d_mat.cel_shading.cutoutSource = 'ENVIRONMENT' +f3d_mat.cel_shading.levels.clear() +bpy.context.material.f3d_update_flag = False +f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update +""" + +oot_shaded_vcol_multitexture_lerp_ao = """ +import bpy +f3d_mat = bpy.context.material.f3d_mat + +bpy.context.material.f3d_update_flag = True +f3d_mat.presetName = 'Oot Shaded Vcol Multitexture Lerp Ao' +f3d_mat.combiner1.name = '' +f3d_mat.combiner1.A = 'TEXEL1' +f3d_mat.combiner1.B = 'TEXEL0' +f3d_mat.combiner1.C = 'ENV_ALPHA' +f3d_mat.combiner1.D = 'TEXEL0' +f3d_mat.combiner1.A_alpha = '0' +f3d_mat.combiner1.B_alpha = '0' +f3d_mat.combiner1.C_alpha = '0' +f3d_mat.combiner1.D_alpha = '1' +f3d_mat.combiner2.name = '' +f3d_mat.combiner2.A = 'COMBINED' +f3d_mat.combiner2.B = '0' +f3d_mat.combiner2.C = 'SHADE' +f3d_mat.combiner2.D = '0' +f3d_mat.combiner2.A_alpha = '0' +f3d_mat.combiner2.B_alpha = '0' +f3d_mat.combiner2.C_alpha = '0' +f3d_mat.combiner2.D_alpha = 'COMBINED' +f3d_mat.tex0.name = '' +f3d_mat.tex0.tex_set = True +f3d_mat.tex1.name = '' +f3d_mat.tex1.tex_set = True +f3d_mat.set_prim = True +f3d_mat.set_lights = False +f3d_mat.set_env = True +f3d_mat.set_blend = False +f3d_mat.set_key = True +f3d_mat.set_k0_5 = True +f3d_mat.set_combiner = True +f3d_mat.use_default_lighting = True +f3d_mat.blend_color = (0.0, 0.0, 0.0, 1.0) +f3d_mat.prim_color = (1.0, 1.0, 1.0, 1.0) +f3d_mat.env_color = (1.0, 1.0, 1.0, 0.5) +f3d_mat.key_center = (0.5, 0.5, 0.5, 1.0) +f3d_mat.key_scale = (0.0, 0.0, 0.0) +f3d_mat.key_width = (0.0, 0.0, 0.0) +f3d_mat.k0 = 0.686274528503418 +f3d_mat.k1 = -0.16862745583057404 +f3d_mat.k2 = -0.3490196168422699 +f3d_mat.k3 = 0.8705882430076599 +f3d_mat.k4 = 0.4470588266849518 +f3d_mat.k5 = 0.16470588743686676 +f3d_mat.prim_lod_frac = 0.0 +f3d_mat.prim_lod_min = 0.0 +f3d_mat.default_light_color = (1.0, 1.0, 1.0, 1.0) +f3d_mat.set_ambient_from_light = True +f3d_mat.ambient_light_color = (0.2140410989522934, 0.2140410989522934, 0.2140410989522934, 1.0) +f3d_mat.f3d_light1 = None +f3d_mat.f3d_light2 = None +f3d_mat.f3d_light3 = None +f3d_mat.f3d_light4 = None +f3d_mat.f3d_light5 = None +f3d_mat.f3d_light6 = None +f3d_mat.f3d_light7 = None +f3d_mat.ao_ambient = 1.0 +f3d_mat.ao_directional = 0.625 +f3d_mat.ao_point = 0.0 +f3d_mat.set_ao = False +f3d_mat.fresnel_lo = 0.699999988079071 +f3d_mat.fresnel_hi = 0.4000000059604645 +f3d_mat.set_fresnel = False +f3d_mat.attroffs_st = (0.0, 0.0) +f3d_mat.attroffs_z = -2 +f3d_mat.set_attroffs_st = False +f3d_mat.set_attroffs_z = False +f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) +f3d_mat.fog_position = (985, 1000) +f3d_mat.set_fog = False +f3d_mat.use_global_fog = True +f3d_mat.rdp_settings.name = '' +f3d_mat.rdp_settings.g_zbuffer = True +f3d_mat.rdp_settings.g_shade = True +f3d_mat.rdp_settings.g_ambocclusion = True +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False +f3d_mat.rdp_settings.g_cull_front = False +f3d_mat.rdp_settings.g_cull_back = True +f3d_mat.rdp_settings.g_packed_normals = True +f3d_mat.rdp_settings.g_lighttoalpha = False +f3d_mat.rdp_settings.g_lighting_specular = False +f3d_mat.rdp_settings.g_fresnel_color = False +f3d_mat.rdp_settings.g_fresnel_alpha = False +f3d_mat.rdp_settings.g_fog = True +f3d_mat.rdp_settings.g_lighting = True +f3d_mat.rdp_settings.g_tex_gen = False +f3d_mat.rdp_settings.g_tex_gen_linear = False +f3d_mat.rdp_settings.g_lod = False +f3d_mat.rdp_settings.g_shade_smooth = True +f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' +f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' +f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' +f3d_mat.rdp_settings.g_mdsft_textconv = 'G_TC_FILT' +f3d_mat.rdp_settings.g_mdsft_text_filt = 'G_TF_BILERP' +f3d_mat.rdp_settings.g_mdsft_textlut = 'G_TT_NONE' +f3d_mat.rdp_settings.g_mdsft_textlod = 'G_TL_TILE' +f3d_mat.rdp_settings.num_textures_mipmapped = 2 +f3d_mat.rdp_settings.g_mdsft_textdetail = 'G_TD_CLAMP' +f3d_mat.rdp_settings.g_mdsft_textpersp = 'G_TP_PERSP' +f3d_mat.rdp_settings.g_mdsft_cycletype = 'G_CYC_2CYCLE' +f3d_mat.rdp_settings.g_mdsft_color_dither = 'G_CD_ENABLE' +f3d_mat.rdp_settings.g_mdsft_pipeline = 'G_PM_NPRIMITIVE' +f3d_mat.rdp_settings.g_mdsft_alpha_compare = 'G_AC_NONE' +f3d_mat.rdp_settings.g_mdsft_zsrcsel = 'G_ZS_PIXEL' +f3d_mat.rdp_settings.prim_depth.name = '' +f3d_mat.rdp_settings.prim_depth.z = 0 +f3d_mat.rdp_settings.prim_depth.dz = 0 +f3d_mat.rdp_settings.clip_ratio = 1 +f3d_mat.rdp_settings.set_rendermode = True +f3d_mat.rdp_settings.rendermode_advanced_enabled = False +f3d_mat.rdp_settings.rendermode_preset_cycle_1 = 'G_RM_FOG_SHADE_A' +f3d_mat.rdp_settings.rendermode_preset_cycle_2 = 'G_RM_AA_ZB_OPA_SURF2' +f3d_mat.rdp_settings.aa_en = False +f3d_mat.rdp_settings.z_cmp = False +f3d_mat.rdp_settings.z_upd = False +f3d_mat.rdp_settings.im_rd = False +f3d_mat.rdp_settings.clr_on_cvg = False +f3d_mat.rdp_settings.cvg_dst = 'CVG_DST_CLAMP' +f3d_mat.rdp_settings.zmode = 'ZMODE_OPA' +f3d_mat.rdp_settings.cvg_x_alpha = False +f3d_mat.rdp_settings.alpha_cvg_sel = False +f3d_mat.rdp_settings.force_bl = False +f3d_mat.rdp_settings.blend_p1 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_p2 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_m1 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_m2 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_a1 = 'G_BL_A_IN' +f3d_mat.rdp_settings.blend_a2 = 'G_BL_A_IN' +f3d_mat.rdp_settings.blend_b1 = 'G_BL_1MA' +f3d_mat.rdp_settings.blend_b2 = 'G_BL_1MA' +f3d_mat.draw_layer.name = '' +f3d_mat.draw_layer.sm64 = '1' +f3d_mat.draw_layer.oot = 'Opaque' +f3d_mat.large_edges = 'Clamp' +f3d_mat.expand_cel_shading_ui = False +f3d_mat.use_cel_shading = False +f3d_mat.cel_shading.name = '' +f3d_mat.cel_shading.tintPipeline = 'CC' +f3d_mat.cel_shading.cutoutSource = 'ENVIRONMENT' +f3d_mat.cel_shading.levels.clear() +bpy.context.material.f3d_update_flag = False +f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update +""" + +oot_shaded_vcol_multitexture_lerp_ao_transparent = """ +import bpy +f3d_mat = bpy.context.material.f3d_mat + +bpy.context.material.f3d_update_flag = True +f3d_mat.presetName = 'Oot Shaded Vcol Multitexture Lerp Ao Transparent' +f3d_mat.combiner1.name = '' +f3d_mat.combiner1.A = 'TEXEL1' +f3d_mat.combiner1.B = 'TEXEL0' +f3d_mat.combiner1.C = 'ENV_ALPHA' +f3d_mat.combiner1.D = 'TEXEL0' +f3d_mat.combiner1.A_alpha = '0' +f3d_mat.combiner1.B_alpha = '0' +f3d_mat.combiner1.C_alpha = '0' +f3d_mat.combiner1.D_alpha = '1' +f3d_mat.combiner2.name = '' +f3d_mat.combiner2.A = 'COMBINED' +f3d_mat.combiner2.B = '0' +f3d_mat.combiner2.C = 'SHADE' +f3d_mat.combiner2.D = '0' +f3d_mat.combiner2.A_alpha = 'COMBINED' +f3d_mat.combiner2.B_alpha = '0' +f3d_mat.combiner2.C_alpha = 'PRIMITIVE' +f3d_mat.combiner2.D_alpha = '0' +f3d_mat.tex0.name = '' +f3d_mat.tex0.tex_set = True +f3d_mat.tex1.name = '' +f3d_mat.tex1.tex_set = True +f3d_mat.set_prim = True +f3d_mat.set_lights = False +f3d_mat.set_env = True +f3d_mat.set_blend = False +f3d_mat.set_key = True +f3d_mat.set_k0_5 = True +f3d_mat.set_combiner = True +f3d_mat.use_default_lighting = True +f3d_mat.blend_color = (0.0, 0.0, 0.0, 1.0) +f3d_mat.prim_color = (1.0, 1.0, 1.0, 0.5) +f3d_mat.env_color = (1.0, 1.0, 1.0, 0.5) +f3d_mat.key_center = (0.5, 0.5, 0.5, 1.0) +f3d_mat.key_scale = (0.0, 0.0, 0.0) +f3d_mat.key_width = (0.0, 0.0, 0.0) +f3d_mat.k0 = 0.686274528503418 +f3d_mat.k1 = -0.16862745583057404 +f3d_mat.k2 = -0.3490196168422699 +f3d_mat.k3 = 0.8705882430076599 +f3d_mat.k4 = 0.4470588266849518 +f3d_mat.k5 = 0.16470588743686676 +f3d_mat.prim_lod_frac = 0.0 +f3d_mat.prim_lod_min = 0.0 +f3d_mat.default_light_color = (1.0, 1.0, 1.0, 1.0) +f3d_mat.set_ambient_from_light = True +f3d_mat.ambient_light_color = (0.2140410989522934, 0.2140410989522934, 0.2140410989522934, 1.0) +f3d_mat.f3d_light1 = None +f3d_mat.f3d_light2 = None +f3d_mat.f3d_light3 = None +f3d_mat.f3d_light4 = None +f3d_mat.f3d_light5 = None +f3d_mat.f3d_light6 = None +f3d_mat.f3d_light7 = None +f3d_mat.ao_ambient = 1.0 +f3d_mat.ao_directional = 0.625 +f3d_mat.ao_point = 0.0 +f3d_mat.set_ao = False +f3d_mat.fresnel_lo = 0.699999988079071 +f3d_mat.fresnel_hi = 0.4000000059604645 +f3d_mat.set_fresnel = False +f3d_mat.attroffs_st = (0.0, 0.0) +f3d_mat.attroffs_z = -2 +f3d_mat.set_attroffs_st = False +f3d_mat.set_attroffs_z = False +f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) +f3d_mat.fog_position = (985, 1000) +f3d_mat.set_fog = False +f3d_mat.use_global_fog = True +f3d_mat.rdp_settings.name = '' +f3d_mat.rdp_settings.g_zbuffer = True +f3d_mat.rdp_settings.g_shade = True +f3d_mat.rdp_settings.g_ambocclusion = True +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False +f3d_mat.rdp_settings.g_cull_front = False +f3d_mat.rdp_settings.g_cull_back = False +f3d_mat.rdp_settings.g_packed_normals = True +f3d_mat.rdp_settings.g_lighttoalpha = False +f3d_mat.rdp_settings.g_lighting_specular = False +f3d_mat.rdp_settings.g_fresnel_color = False +f3d_mat.rdp_settings.g_fresnel_alpha = False +f3d_mat.rdp_settings.g_fog = True +f3d_mat.rdp_settings.g_lighting = True +f3d_mat.rdp_settings.g_tex_gen = False +f3d_mat.rdp_settings.g_tex_gen_linear = False +f3d_mat.rdp_settings.g_lod = False +f3d_mat.rdp_settings.g_shade_smooth = True +f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' +f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' +f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' +f3d_mat.rdp_settings.g_mdsft_textconv = 'G_TC_FILT' +f3d_mat.rdp_settings.g_mdsft_text_filt = 'G_TF_BILERP' +f3d_mat.rdp_settings.g_mdsft_textlut = 'G_TT_NONE' +f3d_mat.rdp_settings.g_mdsft_textlod = 'G_TL_TILE' +f3d_mat.rdp_settings.num_textures_mipmapped = 2 +f3d_mat.rdp_settings.g_mdsft_textdetail = 'G_TD_CLAMP' +f3d_mat.rdp_settings.g_mdsft_textpersp = 'G_TP_PERSP' +f3d_mat.rdp_settings.g_mdsft_cycletype = 'G_CYC_2CYCLE' +f3d_mat.rdp_settings.g_mdsft_color_dither = 'G_CD_ENABLE' +f3d_mat.rdp_settings.g_mdsft_pipeline = 'G_PM_NPRIMITIVE' +f3d_mat.rdp_settings.g_mdsft_alpha_compare = 'G_AC_NONE' +f3d_mat.rdp_settings.g_mdsft_zsrcsel = 'G_ZS_PIXEL' +f3d_mat.rdp_settings.prim_depth.name = '' +f3d_mat.rdp_settings.prim_depth.z = 0 +f3d_mat.rdp_settings.prim_depth.dz = 0 +f3d_mat.rdp_settings.clip_ratio = 1 +f3d_mat.rdp_settings.set_rendermode = True +f3d_mat.rdp_settings.rendermode_advanced_enabled = False +f3d_mat.rdp_settings.rendermode_preset_cycle_1 = 'G_RM_FOG_SHADE_A' +f3d_mat.rdp_settings.rendermode_preset_cycle_2 = 'G_RM_AA_ZB_XLU_SURF2' +f3d_mat.rdp_settings.aa_en = False +f3d_mat.rdp_settings.z_cmp = False +f3d_mat.rdp_settings.z_upd = False +f3d_mat.rdp_settings.im_rd = False +f3d_mat.rdp_settings.clr_on_cvg = False +f3d_mat.rdp_settings.cvg_dst = 'CVG_DST_CLAMP' +f3d_mat.rdp_settings.zmode = 'ZMODE_OPA' +f3d_mat.rdp_settings.cvg_x_alpha = False +f3d_mat.rdp_settings.alpha_cvg_sel = False +f3d_mat.rdp_settings.force_bl = False +f3d_mat.rdp_settings.blend_p1 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_p2 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_m1 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_m2 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_a1 = 'G_BL_A_IN' +f3d_mat.rdp_settings.blend_a2 = 'G_BL_A_IN' +f3d_mat.rdp_settings.blend_b1 = 'G_BL_1MA' +f3d_mat.rdp_settings.blend_b2 = 'G_BL_1MA' +f3d_mat.draw_layer.name = '' +f3d_mat.draw_layer.sm64 = '5' +f3d_mat.draw_layer.oot = 'Transparent' +f3d_mat.large_edges = 'Clamp' +f3d_mat.expand_cel_shading_ui = False +f3d_mat.use_cel_shading = False +f3d_mat.cel_shading.name = '' +f3d_mat.cel_shading.tintPipeline = 'CC' +f3d_mat.cel_shading.cutoutSource = 'ENVIRONMENT' +f3d_mat.cel_shading.levels.clear() +bpy.context.material.f3d_update_flag = False +f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update +""" + +oot_shaded_vcol_multitexture_lerp_transparent_vertex_alpha = """ +import bpy +f3d_mat = bpy.context.material.f3d_mat + +bpy.context.material.f3d_update_flag = True +f3d_mat.presetName = 'Oot Shaded Vcol Multitexture Lerp Transparent Vertex Alpha' +f3d_mat.combiner1.name = '' +f3d_mat.combiner1.A = 'TEXEL1' +f3d_mat.combiner1.B = 'TEXEL0' +f3d_mat.combiner1.C = 'ENV_ALPHA' +f3d_mat.combiner1.D = 'TEXEL0' +f3d_mat.combiner1.A_alpha = 'TEXEL1' +f3d_mat.combiner1.B_alpha = 'TEXEL0' +f3d_mat.combiner1.C_alpha = 'ENVIRONMENT' +f3d_mat.combiner1.D_alpha = 'TEXEL0' +f3d_mat.combiner2.name = '' +f3d_mat.combiner2.A = 'COMBINED' +f3d_mat.combiner2.B = '0' +f3d_mat.combiner2.C = 'SHADE' +f3d_mat.combiner2.D = '0' +f3d_mat.combiner2.A_alpha = 'COMBINED' +f3d_mat.combiner2.B_alpha = '0' +f3d_mat.combiner2.C_alpha = 'SHADE' +f3d_mat.combiner2.D_alpha = '0' +f3d_mat.tex0.name = '' +f3d_mat.tex0.tex_set = True +f3d_mat.tex1.name = '' +f3d_mat.tex1.tex_set = True +f3d_mat.set_prim = True +f3d_mat.set_lights = False +f3d_mat.set_env = True +f3d_mat.set_blend = False +f3d_mat.set_key = True +f3d_mat.set_k0_5 = True +f3d_mat.set_combiner = True +f3d_mat.use_default_lighting = True +f3d_mat.blend_color = (0.0, 0.0, 0.0, 1.0) +f3d_mat.prim_color = (1.0, 1.0, 1.0, 1.0) +f3d_mat.env_color = (1.0, 1.0, 1.0, 0.5) +f3d_mat.key_center = (0.5, 0.5, 0.5, 1.0) +f3d_mat.key_scale = (0.0, 0.0, 0.0) +f3d_mat.key_width = (0.0, 0.0, 0.0) +f3d_mat.k0 = 0.686274528503418 +f3d_mat.k1 = -0.16862745583057404 +f3d_mat.k2 = -0.3490196168422699 +f3d_mat.k3 = 0.8705882430076599 +f3d_mat.k4 = 0.4470588266849518 +f3d_mat.k5 = 0.16470588743686676 +f3d_mat.prim_lod_frac = 0.0 +f3d_mat.prim_lod_min = 0.0 +f3d_mat.default_light_color = (1.0, 1.0, 1.0, 1.0) +f3d_mat.set_ambient_from_light = True +f3d_mat.ambient_light_color = (0.2140410989522934, 0.2140410989522934, 0.2140410989522934, 1.0) +f3d_mat.f3d_light1 = None +f3d_mat.f3d_light2 = None +f3d_mat.f3d_light3 = None +f3d_mat.f3d_light4 = None +f3d_mat.f3d_light5 = None +f3d_mat.f3d_light6 = None +f3d_mat.f3d_light7 = None +f3d_mat.ao_ambient = 1.0 +f3d_mat.ao_directional = 0.625 +f3d_mat.ao_point = 0.0 +f3d_mat.set_ao = False +f3d_mat.fresnel_lo = 0.699999988079071 +f3d_mat.fresnel_hi = 0.4000000059604645 +f3d_mat.set_fresnel = False +f3d_mat.attroffs_st = (0.0, 0.0) +f3d_mat.attroffs_z = -2 +f3d_mat.set_attroffs_st = False +f3d_mat.set_attroffs_z = False +f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) +f3d_mat.fog_position = (985, 1000) +f3d_mat.set_fog = False +f3d_mat.use_global_fog = True +f3d_mat.rdp_settings.name = '' +f3d_mat.rdp_settings.g_zbuffer = True +f3d_mat.rdp_settings.g_shade = True +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False +f3d_mat.rdp_settings.g_cull_front = False +f3d_mat.rdp_settings.g_cull_back = False +f3d_mat.rdp_settings.g_packed_normals = True +f3d_mat.rdp_settings.g_lighttoalpha = False +f3d_mat.rdp_settings.g_lighting_specular = False +f3d_mat.rdp_settings.g_fresnel_color = False +f3d_mat.rdp_settings.g_fresnel_alpha = False +f3d_mat.rdp_settings.g_fog = False +f3d_mat.rdp_settings.g_lighting = True +f3d_mat.rdp_settings.g_tex_gen = False +f3d_mat.rdp_settings.g_tex_gen_linear = False +f3d_mat.rdp_settings.g_lod = False +f3d_mat.rdp_settings.g_shade_smooth = True +f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' +f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' +f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' +f3d_mat.rdp_settings.g_mdsft_textconv = 'G_TC_FILT' +f3d_mat.rdp_settings.g_mdsft_text_filt = 'G_TF_BILERP' +f3d_mat.rdp_settings.g_mdsft_textlut = 'G_TT_NONE' +f3d_mat.rdp_settings.g_mdsft_textlod = 'G_TL_TILE' +f3d_mat.rdp_settings.num_textures_mipmapped = 2 +f3d_mat.rdp_settings.g_mdsft_textdetail = 'G_TD_CLAMP' +f3d_mat.rdp_settings.g_mdsft_textpersp = 'G_TP_PERSP' +f3d_mat.rdp_settings.g_mdsft_cycletype = 'G_CYC_2CYCLE' +f3d_mat.rdp_settings.g_mdsft_color_dither = 'G_CD_ENABLE' +f3d_mat.rdp_settings.g_mdsft_pipeline = 'G_PM_NPRIMITIVE' +f3d_mat.rdp_settings.g_mdsft_alpha_compare = 'G_AC_NONE' +f3d_mat.rdp_settings.g_mdsft_zsrcsel = 'G_ZS_PIXEL' +f3d_mat.rdp_settings.prim_depth.name = '' +f3d_mat.rdp_settings.prim_depth.z = 0 +f3d_mat.rdp_settings.prim_depth.dz = 0 +f3d_mat.rdp_settings.clip_ratio = 1 +f3d_mat.rdp_settings.set_rendermode = True +f3d_mat.rdp_settings.rendermode_advanced_enabled = False +f3d_mat.rdp_settings.rendermode_preset_cycle_1 = 'G_RM_OPA_SURF' +f3d_mat.rdp_settings.rendermode_preset_cycle_2 = 'G_RM_AA_ZB_XLU_SURF2' +f3d_mat.rdp_settings.aa_en = False +f3d_mat.rdp_settings.z_cmp = False +f3d_mat.rdp_settings.z_upd = False +f3d_mat.rdp_settings.im_rd = False +f3d_mat.rdp_settings.clr_on_cvg = False +f3d_mat.rdp_settings.cvg_dst = 'CVG_DST_CLAMP' +f3d_mat.rdp_settings.zmode = 'ZMODE_OPA' +f3d_mat.rdp_settings.cvg_x_alpha = False +f3d_mat.rdp_settings.alpha_cvg_sel = False +f3d_mat.rdp_settings.force_bl = False +f3d_mat.rdp_settings.blend_p1 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_p2 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_m1 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_m2 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_a1 = 'G_BL_A_IN' +f3d_mat.rdp_settings.blend_a2 = 'G_BL_A_IN' +f3d_mat.rdp_settings.blend_b1 = 'G_BL_1MA' +f3d_mat.rdp_settings.blend_b2 = 'G_BL_1MA' +f3d_mat.draw_layer.name = '' +f3d_mat.draw_layer.sm64 = '5' +f3d_mat.draw_layer.oot = 'Transparent' +f3d_mat.large_edges = 'Clamp' +f3d_mat.expand_cel_shading_ui = False +f3d_mat.use_cel_shading = False +f3d_mat.cel_shading.name = '' +f3d_mat.cel_shading.tintPipeline = 'CC' +f3d_mat.cel_shading.cutoutSource = 'ENVIRONMENT' +f3d_mat.cel_shading.levels.clear() +bpy.context.material.f3d_update_flag = False +f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update +""" + +oot_shaded_vcol_solid_ao = """ +import bpy +f3d_mat = bpy.context.material.f3d_mat + +bpy.context.material.f3d_update_flag = True +f3d_mat.presetName = 'Oot Shaded Vcol Solid Ao' +f3d_mat.combiner1.name = '' +f3d_mat.combiner1.A = '0' +f3d_mat.combiner1.B = '0' +f3d_mat.combiner1.C = '0' +f3d_mat.combiner1.D = 'SHADE' +f3d_mat.combiner1.A_alpha = '0' +f3d_mat.combiner1.B_alpha = '0' +f3d_mat.combiner1.C_alpha = '0' +f3d_mat.combiner1.D_alpha = '1' +f3d_mat.combiner2.name = '' +f3d_mat.combiner2.A = 'COMBINED' +f3d_mat.combiner2.B = '0' +f3d_mat.combiner2.C = 'PRIMITIVE' +f3d_mat.combiner2.D = '0' +f3d_mat.combiner2.A_alpha = '0' +f3d_mat.combiner2.B_alpha = '0' +f3d_mat.combiner2.C_alpha = '0' +f3d_mat.combiner2.D_alpha = 'COMBINED' +f3d_mat.tex0.name = '' +f3d_mat.tex0.tex_set = True +f3d_mat.tex1.name = '' +f3d_mat.tex1.tex_set = True +f3d_mat.set_prim = True +f3d_mat.set_lights = False +f3d_mat.set_env = True +f3d_mat.set_blend = False +f3d_mat.set_key = True +f3d_mat.set_k0_5 = True +f3d_mat.set_combiner = True +f3d_mat.use_default_lighting = True +f3d_mat.blend_color = (0.0, 0.0, 0.0, 1.0) +f3d_mat.prim_color = (1.0, 1.0, 1.0, 1.0) +f3d_mat.env_color = (1.0, 1.0, 1.0, 1.0) +f3d_mat.key_center = (0.5, 0.5, 0.5, 1.0) +f3d_mat.key_scale = (0.0, 0.0, 0.0) +f3d_mat.key_width = (0.0, 0.0, 0.0) +f3d_mat.k0 = 0.686274528503418 +f3d_mat.k1 = -0.16862745583057404 +f3d_mat.k2 = -0.3490196168422699 +f3d_mat.k3 = 0.8705882430076599 +f3d_mat.k4 = 0.4470588266849518 +f3d_mat.k5 = 0.16470588743686676 +f3d_mat.prim_lod_frac = 0.0 +f3d_mat.prim_lod_min = 0.0 +f3d_mat.default_light_color = (1.0, 1.0, 1.0, 1.0) +f3d_mat.set_ambient_from_light = True +f3d_mat.ambient_light_color = (0.2140410989522934, 0.2140410989522934, 0.2140410989522934, 1.0) +f3d_mat.f3d_light1 = None +f3d_mat.f3d_light2 = None +f3d_mat.f3d_light3 = None +f3d_mat.f3d_light4 = None +f3d_mat.f3d_light5 = None +f3d_mat.f3d_light6 = None +f3d_mat.f3d_light7 = None +f3d_mat.ao_ambient = 1.0 +f3d_mat.ao_directional = 0.625 +f3d_mat.ao_point = 0.0 +f3d_mat.set_ao = False +f3d_mat.fresnel_lo = 0.699999988079071 +f3d_mat.fresnel_hi = 0.4000000059604645 +f3d_mat.set_fresnel = False +f3d_mat.attroffs_st = (0.0, 0.0) +f3d_mat.attroffs_z = -2 +f3d_mat.set_attroffs_st = False +f3d_mat.set_attroffs_z = False +f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) +f3d_mat.fog_position = (985, 1000) +f3d_mat.set_fog = False +f3d_mat.use_global_fog = True +f3d_mat.rdp_settings.name = '' +f3d_mat.rdp_settings.g_zbuffer = True +f3d_mat.rdp_settings.g_shade = True +f3d_mat.rdp_settings.g_ambocclusion = True +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False +f3d_mat.rdp_settings.g_cull_front = False +f3d_mat.rdp_settings.g_cull_back = True +f3d_mat.rdp_settings.g_packed_normals = True +f3d_mat.rdp_settings.g_lighttoalpha = False +f3d_mat.rdp_settings.g_lighting_specular = False +f3d_mat.rdp_settings.g_fresnel_color = False +f3d_mat.rdp_settings.g_fresnel_alpha = False +f3d_mat.rdp_settings.g_fog = True +f3d_mat.rdp_settings.g_lighting = True +f3d_mat.rdp_settings.g_tex_gen = False +f3d_mat.rdp_settings.g_tex_gen_linear = False +f3d_mat.rdp_settings.g_lod = False +f3d_mat.rdp_settings.g_shade_smooth = True +f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' +f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' +f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' +f3d_mat.rdp_settings.g_mdsft_textconv = 'G_TC_FILT' +f3d_mat.rdp_settings.g_mdsft_text_filt = 'G_TF_BILERP' +f3d_mat.rdp_settings.g_mdsft_textlut = 'G_TT_NONE' +f3d_mat.rdp_settings.g_mdsft_textlod = 'G_TL_TILE' +f3d_mat.rdp_settings.num_textures_mipmapped = 2 +f3d_mat.rdp_settings.g_mdsft_textdetail = 'G_TD_CLAMP' +f3d_mat.rdp_settings.g_mdsft_textpersp = 'G_TP_PERSP' +f3d_mat.rdp_settings.g_mdsft_cycletype = 'G_CYC_2CYCLE' +f3d_mat.rdp_settings.g_mdsft_color_dither = 'G_CD_ENABLE' +f3d_mat.rdp_settings.g_mdsft_pipeline = 'G_PM_NPRIMITIVE' +f3d_mat.rdp_settings.g_mdsft_alpha_compare = 'G_AC_NONE' +f3d_mat.rdp_settings.g_mdsft_zsrcsel = 'G_ZS_PIXEL' +f3d_mat.rdp_settings.prim_depth.name = '' +f3d_mat.rdp_settings.prim_depth.z = 0 +f3d_mat.rdp_settings.prim_depth.dz = 0 +f3d_mat.rdp_settings.clip_ratio = 1 +f3d_mat.rdp_settings.set_rendermode = True +f3d_mat.rdp_settings.rendermode_advanced_enabled = False +f3d_mat.rdp_settings.rendermode_preset_cycle_1 = 'G_RM_FOG_SHADE_A' +f3d_mat.rdp_settings.rendermode_preset_cycle_2 = 'G_RM_AA_ZB_OPA_SURF2' +f3d_mat.rdp_settings.aa_en = False +f3d_mat.rdp_settings.z_cmp = False +f3d_mat.rdp_settings.z_upd = False +f3d_mat.rdp_settings.im_rd = False +f3d_mat.rdp_settings.clr_on_cvg = False +f3d_mat.rdp_settings.cvg_dst = 'CVG_DST_CLAMP' +f3d_mat.rdp_settings.zmode = 'ZMODE_OPA' +f3d_mat.rdp_settings.cvg_x_alpha = False +f3d_mat.rdp_settings.alpha_cvg_sel = False +f3d_mat.rdp_settings.force_bl = False +f3d_mat.rdp_settings.blend_p1 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_p2 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_m1 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_m2 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_a1 = 'G_BL_A_IN' +f3d_mat.rdp_settings.blend_a2 = 'G_BL_A_IN' +f3d_mat.rdp_settings.blend_b1 = 'G_BL_1MA' +f3d_mat.rdp_settings.blend_b2 = 'G_BL_1MA' +f3d_mat.draw_layer.name = '' +f3d_mat.draw_layer.sm64 = '1' +f3d_mat.draw_layer.oot = 'Opaque' +f3d_mat.large_edges = 'Clamp' +f3d_mat.expand_cel_shading_ui = False +f3d_mat.use_cel_shading = False +f3d_mat.cel_shading.name = '' +f3d_mat.cel_shading.tintPipeline = 'CC' +f3d_mat.cel_shading.cutoutSource = 'ENVIRONMENT' +f3d_mat.cel_shading.levels.clear() +bpy.context.material.f3d_update_flag = False +f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update +""" + +oot_shaded_vcol_solid_ao_transparent = """ +import bpy +f3d_mat = bpy.context.material.f3d_mat + +bpy.context.material.f3d_update_flag = True +f3d_mat.presetName = 'Oot Shaded Vcol Solid Ao Transparent' +f3d_mat.combiner1.name = '' +f3d_mat.combiner1.A = '0' +f3d_mat.combiner1.B = '0' +f3d_mat.combiner1.C = '0' +f3d_mat.combiner1.D = 'SHADE' +f3d_mat.combiner1.A_alpha = '0' +f3d_mat.combiner1.B_alpha = '0' +f3d_mat.combiner1.C_alpha = '0' +f3d_mat.combiner1.D_alpha = '1' +f3d_mat.combiner2.name = '' +f3d_mat.combiner2.A = 'COMBINED' +f3d_mat.combiner2.B = '0' +f3d_mat.combiner2.C = 'PRIMITIVE' +f3d_mat.combiner2.D = '0' +f3d_mat.combiner2.A_alpha = 'COMBINED' +f3d_mat.combiner2.B_alpha = '0' +f3d_mat.combiner2.C_alpha = 'PRIMITIVE' +f3d_mat.combiner2.D_alpha = '0' +f3d_mat.tex0.name = '' +f3d_mat.tex0.tex_set = True +f3d_mat.tex1.name = '' +f3d_mat.tex1.tex_set = True +f3d_mat.set_prim = True +f3d_mat.set_lights = False +f3d_mat.set_env = True +f3d_mat.set_blend = False +f3d_mat.set_key = True +f3d_mat.set_k0_5 = True +f3d_mat.set_combiner = True +f3d_mat.use_default_lighting = True +f3d_mat.blend_color = (0.0, 0.0, 0.0, 1.0) +f3d_mat.prim_color = (1.0, 1.0, 1.0, 0.5) +f3d_mat.env_color = (1.0, 1.0, 1.0, 1.0) +f3d_mat.key_center = (0.5, 0.5, 0.5, 1.0) +f3d_mat.key_scale = (0.0, 0.0, 0.0) +f3d_mat.key_width = (0.0, 0.0, 0.0) +f3d_mat.k0 = 0.686274528503418 +f3d_mat.k1 = -0.16862745583057404 +f3d_mat.k2 = -0.3490196168422699 +f3d_mat.k3 = 0.8705882430076599 +f3d_mat.k4 = 0.4470588266849518 +f3d_mat.k5 = 0.16470588743686676 +f3d_mat.prim_lod_frac = 0.0 +f3d_mat.prim_lod_min = 0.0 +f3d_mat.default_light_color = (1.0, 1.0, 1.0, 1.0) +f3d_mat.set_ambient_from_light = True +f3d_mat.ambient_light_color = (0.2140410989522934, 0.2140410989522934, 0.2140410989522934, 1.0) +f3d_mat.f3d_light1 = None +f3d_mat.f3d_light2 = None +f3d_mat.f3d_light3 = None +f3d_mat.f3d_light4 = None +f3d_mat.f3d_light5 = None +f3d_mat.f3d_light6 = None +f3d_mat.f3d_light7 = None +f3d_mat.ao_ambient = 1.0 +f3d_mat.ao_directional = 0.625 +f3d_mat.ao_point = 0.0 +f3d_mat.set_ao = False +f3d_mat.fresnel_lo = 0.699999988079071 +f3d_mat.fresnel_hi = 0.4000000059604645 +f3d_mat.set_fresnel = False +f3d_mat.attroffs_st = (0.0, 0.0) +f3d_mat.attroffs_z = -2 +f3d_mat.set_attroffs_st = False +f3d_mat.set_attroffs_z = False +f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) +f3d_mat.fog_position = (985, 1000) +f3d_mat.set_fog = False +f3d_mat.use_global_fog = True +f3d_mat.rdp_settings.name = '' +f3d_mat.rdp_settings.g_zbuffer = True +f3d_mat.rdp_settings.g_shade = True +f3d_mat.rdp_settings.g_ambocclusion = True +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False +f3d_mat.rdp_settings.g_cull_front = False +f3d_mat.rdp_settings.g_cull_back = False +f3d_mat.rdp_settings.g_packed_normals = True +f3d_mat.rdp_settings.g_lighttoalpha = False +f3d_mat.rdp_settings.g_lighting_specular = False +f3d_mat.rdp_settings.g_fresnel_color = False +f3d_mat.rdp_settings.g_fresnel_alpha = False +f3d_mat.rdp_settings.g_fog = True +f3d_mat.rdp_settings.g_lighting = True +f3d_mat.rdp_settings.g_tex_gen = False +f3d_mat.rdp_settings.g_tex_gen_linear = False +f3d_mat.rdp_settings.g_lod = False +f3d_mat.rdp_settings.g_shade_smooth = True +f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' +f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' +f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' +f3d_mat.rdp_settings.g_mdsft_textconv = 'G_TC_FILT' +f3d_mat.rdp_settings.g_mdsft_text_filt = 'G_TF_BILERP' +f3d_mat.rdp_settings.g_mdsft_textlut = 'G_TT_NONE' +f3d_mat.rdp_settings.g_mdsft_textlod = 'G_TL_TILE' +f3d_mat.rdp_settings.num_textures_mipmapped = 2 +f3d_mat.rdp_settings.g_mdsft_textdetail = 'G_TD_CLAMP' +f3d_mat.rdp_settings.g_mdsft_textpersp = 'G_TP_PERSP' +f3d_mat.rdp_settings.g_mdsft_cycletype = 'G_CYC_2CYCLE' +f3d_mat.rdp_settings.g_mdsft_color_dither = 'G_CD_ENABLE' +f3d_mat.rdp_settings.g_mdsft_pipeline = 'G_PM_NPRIMITIVE' +f3d_mat.rdp_settings.g_mdsft_alpha_compare = 'G_AC_NONE' +f3d_mat.rdp_settings.g_mdsft_zsrcsel = 'G_ZS_PIXEL' +f3d_mat.rdp_settings.prim_depth.name = '' +f3d_mat.rdp_settings.prim_depth.z = 0 +f3d_mat.rdp_settings.prim_depth.dz = 0 +f3d_mat.rdp_settings.clip_ratio = 1 +f3d_mat.rdp_settings.set_rendermode = True +f3d_mat.rdp_settings.rendermode_advanced_enabled = False +f3d_mat.rdp_settings.rendermode_preset_cycle_1 = 'G_RM_FOG_SHADE_A' +f3d_mat.rdp_settings.rendermode_preset_cycle_2 = 'G_RM_AA_ZB_XLU_SURF2' +f3d_mat.rdp_settings.aa_en = False +f3d_mat.rdp_settings.z_cmp = False +f3d_mat.rdp_settings.z_upd = False +f3d_mat.rdp_settings.im_rd = False +f3d_mat.rdp_settings.clr_on_cvg = False +f3d_mat.rdp_settings.cvg_dst = 'CVG_DST_CLAMP' +f3d_mat.rdp_settings.zmode = 'ZMODE_OPA' +f3d_mat.rdp_settings.cvg_x_alpha = False +f3d_mat.rdp_settings.alpha_cvg_sel = False +f3d_mat.rdp_settings.force_bl = False +f3d_mat.rdp_settings.blend_p1 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_p2 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_m1 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_m2 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_a1 = 'G_BL_A_IN' +f3d_mat.rdp_settings.blend_a2 = 'G_BL_A_IN' +f3d_mat.rdp_settings.blend_b1 = 'G_BL_1MA' +f3d_mat.rdp_settings.blend_b2 = 'G_BL_1MA' +f3d_mat.draw_layer.name = '' +f3d_mat.draw_layer.sm64 = '5' +f3d_mat.draw_layer.oot = 'Transparent' +f3d_mat.large_edges = 'Clamp' +f3d_mat.expand_cel_shading_ui = False +f3d_mat.use_cel_shading = False +f3d_mat.cel_shading.name = '' +f3d_mat.cel_shading.tintPipeline = 'CC' +f3d_mat.cel_shading.cutoutSource = 'ENVIRONMENT' +f3d_mat.cel_shading.levels.clear() +bpy.context.material.f3d_update_flag = False +f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update +""" + +oot_shaded_vcol_texture_ao = """ +import bpy +f3d_mat = bpy.context.material.f3d_mat + +bpy.context.material.f3d_update_flag = True +f3d_mat.presetName = 'Oot Shaded Vcol Texture Ao' +f3d_mat.combiner1.name = '' +f3d_mat.combiner1.A = 'TEXEL0' +f3d_mat.combiner1.B = '0' +f3d_mat.combiner1.C = 'SHADE' +f3d_mat.combiner1.D = '0' +f3d_mat.combiner1.A_alpha = '0' +f3d_mat.combiner1.B_alpha = '0' +f3d_mat.combiner1.C_alpha = '0' +f3d_mat.combiner1.D_alpha = '1' +f3d_mat.combiner2.name = '' +f3d_mat.combiner2.A = 'COMBINED' +f3d_mat.combiner2.B = '0' +f3d_mat.combiner2.C = 'PRIMITIVE' +f3d_mat.combiner2.D = '0' +f3d_mat.combiner2.A_alpha = '0' +f3d_mat.combiner2.B_alpha = '0' +f3d_mat.combiner2.C_alpha = '0' +f3d_mat.combiner2.D_alpha = 'COMBINED' +f3d_mat.tex0.name = '' +f3d_mat.tex0.tex_set = True +f3d_mat.tex1.name = '' +f3d_mat.tex1.tex_set = True +f3d_mat.set_prim = True +f3d_mat.set_lights = False +f3d_mat.set_env = False +f3d_mat.set_blend = False +f3d_mat.set_key = True +f3d_mat.set_k0_5 = True +f3d_mat.set_combiner = True +f3d_mat.use_default_lighting = True +f3d_mat.blend_color = (0.0, 0.0, 0.0, 1.0) +f3d_mat.prim_color = (1.0, 1.0, 1.0, 1.0) +f3d_mat.env_color = (0.0, 0.0, 0.0, 1.0) +f3d_mat.key_center = (0.5, 0.5, 0.5, 1.0) +f3d_mat.key_scale = (0.0, 0.0, 0.0) +f3d_mat.key_width = (0.0, 0.0, 0.0) +f3d_mat.k0 = 0.686274528503418 +f3d_mat.k1 = -0.16862745583057404 +f3d_mat.k2 = -0.3490196168422699 +f3d_mat.k3 = 0.8705882430076599 +f3d_mat.k4 = 0.4470588266849518 +f3d_mat.k5 = 0.16470588743686676 +f3d_mat.prim_lod_frac = 0.0 +f3d_mat.prim_lod_min = 0.0 +f3d_mat.default_light_color = (1.0, 1.0, 1.0, 1.0) +f3d_mat.set_ambient_from_light = True +f3d_mat.ambient_light_color = (0.2140410989522934, 0.2140410989522934, 0.2140410989522934, 1.0) +f3d_mat.f3d_light1 = None +f3d_mat.f3d_light2 = None +f3d_mat.f3d_light3 = None +f3d_mat.f3d_light4 = None +f3d_mat.f3d_light5 = None +f3d_mat.f3d_light6 = None +f3d_mat.f3d_light7 = None +f3d_mat.ao_ambient = 1.0 +f3d_mat.ao_directional = 0.625 +f3d_mat.ao_point = 0.0 +f3d_mat.set_ao = False +f3d_mat.fresnel_lo = 0.699999988079071 +f3d_mat.fresnel_hi = 0.4000000059604645 +f3d_mat.set_fresnel = False +f3d_mat.attroffs_st = (0.0, 0.0) +f3d_mat.attroffs_z = -2 +f3d_mat.set_attroffs_st = False +f3d_mat.set_attroffs_z = False +f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) +f3d_mat.fog_position = (985, 1000) +f3d_mat.set_fog = False +f3d_mat.use_global_fog = True +f3d_mat.rdp_settings.name = '' +f3d_mat.rdp_settings.g_zbuffer = True +f3d_mat.rdp_settings.g_shade = True +f3d_mat.rdp_settings.g_ambocclusion = True +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False +f3d_mat.rdp_settings.g_cull_front = False +f3d_mat.rdp_settings.g_cull_back = True +f3d_mat.rdp_settings.g_packed_normals = True +f3d_mat.rdp_settings.g_lighttoalpha = False +f3d_mat.rdp_settings.g_lighting_specular = False +f3d_mat.rdp_settings.g_fresnel_color = False +f3d_mat.rdp_settings.g_fresnel_alpha = False +f3d_mat.rdp_settings.g_fog = True +f3d_mat.rdp_settings.g_lighting = True +f3d_mat.rdp_settings.g_tex_gen = False +f3d_mat.rdp_settings.g_tex_gen_linear = False +f3d_mat.rdp_settings.g_lod = False +f3d_mat.rdp_settings.g_shade_smooth = True +f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' +f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' +f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' +f3d_mat.rdp_settings.g_mdsft_textconv = 'G_TC_FILT' +f3d_mat.rdp_settings.g_mdsft_text_filt = 'G_TF_BILERP' +f3d_mat.rdp_settings.g_mdsft_textlut = 'G_TT_NONE' +f3d_mat.rdp_settings.g_mdsft_textlod = 'G_TL_TILE' +f3d_mat.rdp_settings.num_textures_mipmapped = 2 +f3d_mat.rdp_settings.g_mdsft_textdetail = 'G_TD_CLAMP' +f3d_mat.rdp_settings.g_mdsft_textpersp = 'G_TP_PERSP' +f3d_mat.rdp_settings.g_mdsft_cycletype = 'G_CYC_2CYCLE' +f3d_mat.rdp_settings.g_mdsft_color_dither = 'G_CD_ENABLE' +f3d_mat.rdp_settings.g_mdsft_pipeline = 'G_PM_NPRIMITIVE' +f3d_mat.rdp_settings.g_mdsft_alpha_compare = 'G_AC_NONE' +f3d_mat.rdp_settings.g_mdsft_zsrcsel = 'G_ZS_PIXEL' +f3d_mat.rdp_settings.prim_depth.name = '' +f3d_mat.rdp_settings.prim_depth.z = 0 +f3d_mat.rdp_settings.prim_depth.dz = 0 +f3d_mat.rdp_settings.clip_ratio = 1 +f3d_mat.rdp_settings.set_rendermode = True +f3d_mat.rdp_settings.rendermode_advanced_enabled = False +f3d_mat.rdp_settings.rendermode_preset_cycle_1 = 'G_RM_FOG_SHADE_A' +f3d_mat.rdp_settings.rendermode_preset_cycle_2 = 'G_RM_AA_ZB_OPA_SURF2' +f3d_mat.rdp_settings.aa_en = False +f3d_mat.rdp_settings.z_cmp = False +f3d_mat.rdp_settings.z_upd = False +f3d_mat.rdp_settings.im_rd = False +f3d_mat.rdp_settings.clr_on_cvg = False +f3d_mat.rdp_settings.cvg_dst = 'CVG_DST_CLAMP' +f3d_mat.rdp_settings.zmode = 'ZMODE_OPA' +f3d_mat.rdp_settings.cvg_x_alpha = False +f3d_mat.rdp_settings.alpha_cvg_sel = False +f3d_mat.rdp_settings.force_bl = False +f3d_mat.rdp_settings.blend_p1 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_p2 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_m1 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_m2 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_a1 = 'G_BL_A_IN' +f3d_mat.rdp_settings.blend_a2 = 'G_BL_A_IN' +f3d_mat.rdp_settings.blend_b1 = 'G_BL_1MA' +f3d_mat.rdp_settings.blend_b2 = 'G_BL_1MA' +f3d_mat.draw_layer.name = '' +f3d_mat.draw_layer.sm64 = '1' +f3d_mat.draw_layer.oot = 'Opaque' +f3d_mat.large_edges = 'Clamp' +f3d_mat.expand_cel_shading_ui = False +f3d_mat.use_cel_shading = False +f3d_mat.cel_shading.name = '' +f3d_mat.cel_shading.tintPipeline = 'CC' +f3d_mat.cel_shading.cutoutSource = 'ENVIRONMENT' +f3d_mat.cel_shading.levels.clear() +bpy.context.material.f3d_update_flag = False +f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update +""" + +oot_shaded_vcol_texture_ao_transparent = """ +import bpy +f3d_mat = bpy.context.material.f3d_mat + +bpy.context.material.f3d_update_flag = True +f3d_mat.presetName = 'Oot Shaded Vcol Texture Ao Transparent' +f3d_mat.combiner1.name = '' +f3d_mat.combiner1.A = 'TEXEL0' +f3d_mat.combiner1.B = '0' +f3d_mat.combiner1.C = 'SHADE' +f3d_mat.combiner1.D = '0' +f3d_mat.combiner1.A_alpha = '0' +f3d_mat.combiner1.B_alpha = '0' +f3d_mat.combiner1.C_alpha = '0' +f3d_mat.combiner1.D_alpha = 'TEXEL0' +f3d_mat.combiner2.name = '' +f3d_mat.combiner2.A = 'COMBINED' +f3d_mat.combiner2.B = '0' +f3d_mat.combiner2.C = 'PRIMITIVE' +f3d_mat.combiner2.D = '0' +f3d_mat.combiner2.A_alpha = 'COMBINED' +f3d_mat.combiner2.B_alpha = '0' +f3d_mat.combiner2.C_alpha = 'PRIMITIVE' +f3d_mat.combiner2.D_alpha = '0' +f3d_mat.tex0.name = '' +f3d_mat.tex0.tex_set = True +f3d_mat.tex1.name = '' +f3d_mat.tex1.tex_set = True +f3d_mat.set_prim = True +f3d_mat.set_lights = False +f3d_mat.set_env = False +f3d_mat.set_blend = False +f3d_mat.set_key = True +f3d_mat.set_k0_5 = True +f3d_mat.set_combiner = True +f3d_mat.use_default_lighting = True +f3d_mat.blend_color = (0.0, 0.0, 0.0, 1.0) +f3d_mat.prim_color = (1.0, 1.0, 1.0, 0.5) +f3d_mat.env_color = (0.0, 0.0, 0.0, 1.0) +f3d_mat.key_center = (0.5, 0.5, 0.5, 1.0) +f3d_mat.key_scale = (0.0, 0.0, 0.0) +f3d_mat.key_width = (0.0, 0.0, 0.0) +f3d_mat.k0 = 0.686274528503418 +f3d_mat.k1 = -0.16862745583057404 +f3d_mat.k2 = -0.3490196168422699 +f3d_mat.k3 = 0.8705882430076599 +f3d_mat.k4 = 0.4470588266849518 +f3d_mat.k5 = 0.16470588743686676 +f3d_mat.prim_lod_frac = 0.0 +f3d_mat.prim_lod_min = 0.0 +f3d_mat.default_light_color = (1.0, 1.0, 1.0, 1.0) +f3d_mat.set_ambient_from_light = True +f3d_mat.ambient_light_color = (0.2140410989522934, 0.2140410989522934, 0.2140410989522934, 1.0) +f3d_mat.f3d_light1 = None +f3d_mat.f3d_light2 = None +f3d_mat.f3d_light3 = None +f3d_mat.f3d_light4 = None +f3d_mat.f3d_light5 = None +f3d_mat.f3d_light6 = None +f3d_mat.f3d_light7 = None +f3d_mat.ao_ambient = 1.0 +f3d_mat.ao_directional = 0.625 +f3d_mat.ao_point = 0.0 +f3d_mat.set_ao = False +f3d_mat.fresnel_lo = 0.699999988079071 +f3d_mat.fresnel_hi = 0.4000000059604645 +f3d_mat.set_fresnel = False +f3d_mat.attroffs_st = (0.0, 0.0) +f3d_mat.attroffs_z = -2 +f3d_mat.set_attroffs_st = False +f3d_mat.set_attroffs_z = False +f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) +f3d_mat.fog_position = (985, 1000) +f3d_mat.set_fog = False +f3d_mat.use_global_fog = True +f3d_mat.rdp_settings.name = '' +f3d_mat.rdp_settings.g_zbuffer = True +f3d_mat.rdp_settings.g_shade = True +f3d_mat.rdp_settings.g_ambocclusion = True +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False +f3d_mat.rdp_settings.g_cull_front = False +f3d_mat.rdp_settings.g_cull_back = False +f3d_mat.rdp_settings.g_packed_normals = True +f3d_mat.rdp_settings.g_lighttoalpha = False +f3d_mat.rdp_settings.g_lighting_specular = False +f3d_mat.rdp_settings.g_fresnel_color = False +f3d_mat.rdp_settings.g_fresnel_alpha = False +f3d_mat.rdp_settings.g_fog = True +f3d_mat.rdp_settings.g_lighting = True +f3d_mat.rdp_settings.g_tex_gen = False +f3d_mat.rdp_settings.g_tex_gen_linear = False +f3d_mat.rdp_settings.g_lod = False +f3d_mat.rdp_settings.g_shade_smooth = True +f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' +f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' +f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' +f3d_mat.rdp_settings.g_mdsft_textconv = 'G_TC_FILT' +f3d_mat.rdp_settings.g_mdsft_text_filt = 'G_TF_BILERP' +f3d_mat.rdp_settings.g_mdsft_textlut = 'G_TT_NONE' +f3d_mat.rdp_settings.g_mdsft_textlod = 'G_TL_TILE' +f3d_mat.rdp_settings.num_textures_mipmapped = 2 +f3d_mat.rdp_settings.g_mdsft_textdetail = 'G_TD_CLAMP' +f3d_mat.rdp_settings.g_mdsft_textpersp = 'G_TP_PERSP' +f3d_mat.rdp_settings.g_mdsft_cycletype = 'G_CYC_2CYCLE' +f3d_mat.rdp_settings.g_mdsft_color_dither = 'G_CD_ENABLE' +f3d_mat.rdp_settings.g_mdsft_pipeline = 'G_PM_NPRIMITIVE' +f3d_mat.rdp_settings.g_mdsft_alpha_compare = 'G_AC_NONE' +f3d_mat.rdp_settings.g_mdsft_zsrcsel = 'G_ZS_PIXEL' +f3d_mat.rdp_settings.prim_depth.name = '' +f3d_mat.rdp_settings.prim_depth.z = 0 +f3d_mat.rdp_settings.prim_depth.dz = 0 +f3d_mat.rdp_settings.clip_ratio = 1 +f3d_mat.rdp_settings.set_rendermode = True +f3d_mat.rdp_settings.rendermode_advanced_enabled = False +f3d_mat.rdp_settings.rendermode_preset_cycle_1 = 'G_RM_FOG_SHADE_A' +f3d_mat.rdp_settings.rendermode_preset_cycle_2 = 'G_RM_AA_ZB_XLU_SURF2' +f3d_mat.rdp_settings.aa_en = False +f3d_mat.rdp_settings.z_cmp = False +f3d_mat.rdp_settings.z_upd = False +f3d_mat.rdp_settings.im_rd = False +f3d_mat.rdp_settings.clr_on_cvg = False +f3d_mat.rdp_settings.cvg_dst = 'CVG_DST_CLAMP' +f3d_mat.rdp_settings.zmode = 'ZMODE_OPA' +f3d_mat.rdp_settings.cvg_x_alpha = False +f3d_mat.rdp_settings.alpha_cvg_sel = False +f3d_mat.rdp_settings.force_bl = False +f3d_mat.rdp_settings.blend_p1 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_p2 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_m1 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_m2 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_a1 = 'G_BL_A_IN' +f3d_mat.rdp_settings.blend_a2 = 'G_BL_A_IN' +f3d_mat.rdp_settings.blend_b1 = 'G_BL_1MA' +f3d_mat.rdp_settings.blend_b2 = 'G_BL_1MA' +f3d_mat.draw_layer.name = '' +f3d_mat.draw_layer.sm64 = '5' +f3d_mat.draw_layer.oot = 'Transparent' +f3d_mat.large_edges = 'Clamp' +f3d_mat.expand_cel_shading_ui = False +f3d_mat.use_cel_shading = False +f3d_mat.cel_shading.name = '' +f3d_mat.cel_shading.tintPipeline = 'CC' +f3d_mat.cel_shading.cutoutSource = 'ENVIRONMENT' +f3d_mat.cel_shading.levels.clear() +bpy.context.material.f3d_update_flag = False +f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update +""" + +oot_shaded_vcol_texture_transparent_vertex_alpha = """ +import bpy +f3d_mat = bpy.context.material.f3d_mat + +bpy.context.material.f3d_update_flag = True +f3d_mat.presetName = 'Oot Shaded Vcol Texture Transparent Vertex Alpha' +f3d_mat.combiner1.name = '' +f3d_mat.combiner1.A = 'TEXEL0' +f3d_mat.combiner1.B = '0' +f3d_mat.combiner1.C = 'ENVIRONMENT' +f3d_mat.combiner1.D = '0' +f3d_mat.combiner1.A_alpha = 'TEXEL0' +f3d_mat.combiner1.B_alpha = '0' +f3d_mat.combiner1.C_alpha = 'ENVIRONMENT' +f3d_mat.combiner1.D_alpha = '0' +f3d_mat.combiner2.name = '' +f3d_mat.combiner2.A = 'COMBINED' +f3d_mat.combiner2.B = '0' +f3d_mat.combiner2.C = 'SHADE' +f3d_mat.combiner2.D = '0' +f3d_mat.combiner2.A_alpha = 'COMBINED' +f3d_mat.combiner2.B_alpha = '0' +f3d_mat.combiner2.C_alpha = 'SHADE' +f3d_mat.combiner2.D_alpha = '0' +f3d_mat.tex0.name = '' +f3d_mat.tex0.tex_set = True +f3d_mat.tex1.name = '' +f3d_mat.tex1.tex_set = True +f3d_mat.set_prim = True +f3d_mat.set_lights = False +f3d_mat.set_env = True +f3d_mat.set_blend = False +f3d_mat.set_key = True +f3d_mat.set_k0_5 = True +f3d_mat.set_combiner = True +f3d_mat.use_default_lighting = True +f3d_mat.blend_color = (0.0, 0.0, 0.0, 1.0) +f3d_mat.prim_color = (1.0, 1.0, 1.0, 1.0) +f3d_mat.env_color = (1.0, 1.0, 1.0, 0.5) +f3d_mat.key_center = (0.5, 0.5, 0.5, 1.0) +f3d_mat.key_scale = (0.0, 0.0, 0.0) +f3d_mat.key_width = (0.0, 0.0, 0.0) +f3d_mat.k0 = 0.686274528503418 +f3d_mat.k1 = -0.16862745583057404 +f3d_mat.k2 = -0.3490196168422699 +f3d_mat.k3 = 0.8705882430076599 +f3d_mat.k4 = 0.4470588266849518 +f3d_mat.k5 = 0.16470588743686676 +f3d_mat.prim_lod_frac = 0.0 +f3d_mat.prim_lod_min = 0.0 +f3d_mat.default_light_color = (1.0, 1.0, 1.0, 1.0) +f3d_mat.set_ambient_from_light = True +f3d_mat.ambient_light_color = (0.2140410989522934, 0.2140410989522934, 0.2140410989522934, 1.0) +f3d_mat.f3d_light1 = None +f3d_mat.f3d_light2 = None +f3d_mat.f3d_light3 = None +f3d_mat.f3d_light4 = None +f3d_mat.f3d_light5 = None +f3d_mat.f3d_light6 = None +f3d_mat.f3d_light7 = None +f3d_mat.ao_ambient = 1.0 +f3d_mat.ao_directional = 0.625 +f3d_mat.ao_point = 0.0 +f3d_mat.set_ao = False +f3d_mat.fresnel_lo = 0.699999988079071 +f3d_mat.fresnel_hi = 0.4000000059604645 +f3d_mat.set_fresnel = False +f3d_mat.attroffs_st = (0.0, 0.0) +f3d_mat.attroffs_z = -2 +f3d_mat.set_attroffs_st = False +f3d_mat.set_attroffs_z = False +f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) +f3d_mat.fog_position = (985, 1000) +f3d_mat.set_fog = False +f3d_mat.use_global_fog = True +f3d_mat.rdp_settings.name = '' +f3d_mat.rdp_settings.g_zbuffer = True +f3d_mat.rdp_settings.g_shade = True +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False +f3d_mat.rdp_settings.g_cull_front = False +f3d_mat.rdp_settings.g_cull_back = False +f3d_mat.rdp_settings.g_packed_normals = True +f3d_mat.rdp_settings.g_lighttoalpha = False +f3d_mat.rdp_settings.g_lighting_specular = False +f3d_mat.rdp_settings.g_fresnel_color = False +f3d_mat.rdp_settings.g_fresnel_alpha = False +f3d_mat.rdp_settings.g_fog = False +f3d_mat.rdp_settings.g_lighting = True +f3d_mat.rdp_settings.g_tex_gen = False +f3d_mat.rdp_settings.g_tex_gen_linear = False +f3d_mat.rdp_settings.g_lod = False +f3d_mat.rdp_settings.g_shade_smooth = True +f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' +f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' +f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' +f3d_mat.rdp_settings.g_mdsft_textconv = 'G_TC_FILT' +f3d_mat.rdp_settings.g_mdsft_text_filt = 'G_TF_BILERP' +f3d_mat.rdp_settings.g_mdsft_textlut = 'G_TT_NONE' +f3d_mat.rdp_settings.g_mdsft_textlod = 'G_TL_TILE' +f3d_mat.rdp_settings.num_textures_mipmapped = 2 +f3d_mat.rdp_settings.g_mdsft_textdetail = 'G_TD_CLAMP' +f3d_mat.rdp_settings.g_mdsft_textpersp = 'G_TP_PERSP' +f3d_mat.rdp_settings.g_mdsft_cycletype = 'G_CYC_2CYCLE' +f3d_mat.rdp_settings.g_mdsft_color_dither = 'G_CD_ENABLE' +f3d_mat.rdp_settings.g_mdsft_pipeline = 'G_PM_NPRIMITIVE' +f3d_mat.rdp_settings.g_mdsft_alpha_compare = 'G_AC_NONE' +f3d_mat.rdp_settings.g_mdsft_zsrcsel = 'G_ZS_PIXEL' +f3d_mat.rdp_settings.prim_depth.name = '' +f3d_mat.rdp_settings.prim_depth.z = 0 +f3d_mat.rdp_settings.prim_depth.dz = 0 +f3d_mat.rdp_settings.clip_ratio = 1 +f3d_mat.rdp_settings.set_rendermode = True +f3d_mat.rdp_settings.rendermode_advanced_enabled = False +f3d_mat.rdp_settings.rendermode_preset_cycle_1 = 'G_RM_OPA_SURF' +f3d_mat.rdp_settings.rendermode_preset_cycle_2 = 'G_RM_AA_ZB_XLU_SURF2' +f3d_mat.rdp_settings.aa_en = False +f3d_mat.rdp_settings.z_cmp = False +f3d_mat.rdp_settings.z_upd = False +f3d_mat.rdp_settings.im_rd = False +f3d_mat.rdp_settings.clr_on_cvg = False +f3d_mat.rdp_settings.cvg_dst = 'CVG_DST_CLAMP' +f3d_mat.rdp_settings.zmode = 'ZMODE_OPA' +f3d_mat.rdp_settings.cvg_x_alpha = False +f3d_mat.rdp_settings.alpha_cvg_sel = False +f3d_mat.rdp_settings.force_bl = False +f3d_mat.rdp_settings.blend_p1 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_p2 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_m1 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_m2 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_a1 = 'G_BL_A_IN' +f3d_mat.rdp_settings.blend_a2 = 'G_BL_A_IN' +f3d_mat.rdp_settings.blend_b1 = 'G_BL_1MA' +f3d_mat.rdp_settings.blend_b2 = 'G_BL_1MA' +f3d_mat.draw_layer.name = '' +f3d_mat.draw_layer.sm64 = '5' +f3d_mat.draw_layer.oot = 'Transparent' +f3d_mat.large_edges = 'Clamp' +f3d_mat.expand_cel_shading_ui = False +f3d_mat.use_cel_shading = False +f3d_mat.cel_shading.name = '' +f3d_mat.cel_shading.tintPipeline = 'CC' +f3d_mat.cel_shading.cutoutSource = 'ENVIRONMENT' +f3d_mat.cel_shading.levels.clear() +bpy.context.material.f3d_update_flag = False +f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update +""" + +oot_water_lerp_specular_fresnel = """ +import bpy +f3d_mat = bpy.context.material.f3d_mat + +bpy.context.material.f3d_update_flag = True +f3d_mat.presetName = 'Oot Water Lerp Specular Fresnel' +f3d_mat.combiner1.name = '' +f3d_mat.combiner1.A = 'TEXEL1' +f3d_mat.combiner1.B = 'TEXEL0' +f3d_mat.combiner1.C = 'ENV_ALPHA' +f3d_mat.combiner1.D = 'TEXEL0' +f3d_mat.combiner1.A_alpha = 'TEXEL1' +f3d_mat.combiner1.B_alpha = 'TEXEL0' +f3d_mat.combiner1.C_alpha = 'ENVIRONMENT' +f3d_mat.combiner1.D_alpha = 'TEXEL0' +f3d_mat.combiner2.name = '' +f3d_mat.combiner2.A = 'SHADE' +f3d_mat.combiner2.B = 'PRIMITIVE' +f3d_mat.combiner2.C = 'COMBINED' +f3d_mat.combiner2.D = 'PRIMITIVE' +f3d_mat.combiner2.A_alpha = 'COMBINED' +f3d_mat.combiner2.B_alpha = '0' +f3d_mat.combiner2.C_alpha = 'PRIMITIVE' +f3d_mat.combiner2.D_alpha = 'SHADE' +f3d_mat.tex0.name = '' +f3d_mat.tex0.tex_set = True +f3d_mat.tex1.name = '' +f3d_mat.tex1.tex_set = True +f3d_mat.set_prim = True +f3d_mat.set_lights = False +f3d_mat.set_env = True +f3d_mat.set_blend = False +f3d_mat.set_key = True +f3d_mat.set_k0_5 = True +f3d_mat.set_combiner = True +f3d_mat.use_default_lighting = True +f3d_mat.blend_color = (0.0, 0.0, 0.0, 1.0) +f3d_mat.prim_color = (0.10837142914533615, 0.24593788385391235, 0.5403782725334167, 1.0) +f3d_mat.env_color = (1.0, 1.0, 1.0, 0.5) +f3d_mat.key_center = (0.5, 0.5, 0.5, 1.0) +f3d_mat.key_scale = (0.0, 0.0, 0.0) +f3d_mat.key_width = (0.0, 0.0, 0.0) +f3d_mat.k0 = 0.686274528503418 +f3d_mat.k1 = -0.16862745583057404 +f3d_mat.k2 = -0.3490196168422699 +f3d_mat.k3 = 0.8705882430076599 +f3d_mat.k4 = 0.4470588266849518 +f3d_mat.k5 = 0.16470588743686676 +f3d_mat.prim_lod_frac = 0.0 +f3d_mat.prim_lod_min = 0.0 +f3d_mat.default_light_color = (1.0, 1.0, 1.0, 1.0) +f3d_mat.set_ambient_from_light = True +f3d_mat.ambient_light_color = (0.2140410989522934, 0.2140410989522934, 0.2140410989522934, 1.0) +f3d_mat.f3d_light1 = None +f3d_mat.f3d_light2 = None +f3d_mat.f3d_light3 = None +f3d_mat.f3d_light4 = None +f3d_mat.f3d_light5 = None +f3d_mat.f3d_light6 = None +f3d_mat.f3d_light7 = None +f3d_mat.ao_ambient = 1.0 +f3d_mat.ao_directional = 0.625 +f3d_mat.ao_point = 0.0 +f3d_mat.set_ao = False +f3d_mat.fresnel_lo = 0.699999988079071 +f3d_mat.fresnel_hi = 0.20000000298023224 +f3d_mat.set_fresnel = True +f3d_mat.attroffs_st = (0.0, 0.0) +f3d_mat.attroffs_z = -2 +f3d_mat.set_attroffs_st = False +f3d_mat.set_attroffs_z = False +f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) +f3d_mat.fog_position = (985, 1000) +f3d_mat.set_fog = False +f3d_mat.use_global_fog = True +f3d_mat.rdp_settings.name = '' +f3d_mat.rdp_settings.g_zbuffer = True +f3d_mat.rdp_settings.g_shade = True +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False +f3d_mat.rdp_settings.g_cull_front = False +f3d_mat.rdp_settings.g_cull_back = False +f3d_mat.rdp_settings.g_packed_normals = False +f3d_mat.rdp_settings.g_lighttoalpha = False +f3d_mat.rdp_settings.g_lighting_specular = True +f3d_mat.rdp_settings.g_fresnel_color = False +f3d_mat.rdp_settings.g_fresnel_alpha = True +f3d_mat.rdp_settings.g_fog = False +f3d_mat.rdp_settings.g_lighting = True +f3d_mat.rdp_settings.g_tex_gen = False +f3d_mat.rdp_settings.g_tex_gen_linear = False +f3d_mat.rdp_settings.g_lod = False +f3d_mat.rdp_settings.g_shade_smooth = True +f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' +f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' +f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' +f3d_mat.rdp_settings.g_mdsft_textconv = 'G_TC_FILT' +f3d_mat.rdp_settings.g_mdsft_text_filt = 'G_TF_BILERP' +f3d_mat.rdp_settings.g_mdsft_textlut = 'G_TT_NONE' +f3d_mat.rdp_settings.g_mdsft_textlod = 'G_TL_TILE' +f3d_mat.rdp_settings.num_textures_mipmapped = 2 +f3d_mat.rdp_settings.g_mdsft_textdetail = 'G_TD_CLAMP' +f3d_mat.rdp_settings.g_mdsft_textpersp = 'G_TP_PERSP' +f3d_mat.rdp_settings.g_mdsft_cycletype = 'G_CYC_2CYCLE' +f3d_mat.rdp_settings.g_mdsft_color_dither = 'G_CD_ENABLE' +f3d_mat.rdp_settings.g_mdsft_pipeline = 'G_PM_NPRIMITIVE' +f3d_mat.rdp_settings.g_mdsft_alpha_compare = 'G_AC_NONE' +f3d_mat.rdp_settings.g_mdsft_zsrcsel = 'G_ZS_PIXEL' +f3d_mat.rdp_settings.prim_depth.name = '' +f3d_mat.rdp_settings.prim_depth.z = 0 +f3d_mat.rdp_settings.prim_depth.dz = 0 +f3d_mat.rdp_settings.clip_ratio = 1 +f3d_mat.rdp_settings.set_rendermode = True +f3d_mat.rdp_settings.rendermode_advanced_enabled = True +f3d_mat.rdp_settings.rendermode_preset_cycle_1 = 'G_RM_NOOP' +f3d_mat.rdp_settings.rendermode_preset_cycle_2 = 'G_RM_AA_ZB_XLU_SURF2' +f3d_mat.rdp_settings.aa_en = True +f3d_mat.rdp_settings.z_cmp = True +f3d_mat.rdp_settings.z_upd = False +f3d_mat.rdp_settings.im_rd = True +f3d_mat.rdp_settings.clr_on_cvg = True +f3d_mat.rdp_settings.cvg_dst = 'CVG_DST_WRAP' +f3d_mat.rdp_settings.zmode = 'ZMODE_INTER' +f3d_mat.rdp_settings.cvg_x_alpha = False +f3d_mat.rdp_settings.alpha_cvg_sel = False +f3d_mat.rdp_settings.force_bl = True +f3d_mat.rdp_settings.blend_p1 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_p2 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_m1 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_m2 = 'G_BL_CLR_MEM' +f3d_mat.rdp_settings.blend_a1 = 'G_BL_A_IN' +f3d_mat.rdp_settings.blend_a2 = 'G_BL_A_IN' +f3d_mat.rdp_settings.blend_b1 = 'G_BL_1MA' +f3d_mat.rdp_settings.blend_b2 = 'G_BL_1MA' +f3d_mat.draw_layer.name = '' +f3d_mat.draw_layer.sm64 = '5' +f3d_mat.draw_layer.oot = 'Transparent' +f3d_mat.large_edges = 'Clamp' +f3d_mat.expand_cel_shading_ui = False +f3d_mat.use_cel_shading = False +f3d_mat.cel_shading.name = '' +f3d_mat.cel_shading.tintPipeline = 'CC' +f3d_mat.cel_shading.cutoutSource = 'ENVIRONMENT' +f3d_mat.cel_shading.levels.clear() +bpy.context.material.f3d_update_flag = False +f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update +""" + +oot_water_mult_specular_fresnel = """ +import bpy +f3d_mat = bpy.context.material.f3d_mat + +bpy.context.material.f3d_update_flag = True +f3d_mat.presetName = 'Oot Water Mult Specular Fresnel' +f3d_mat.combiner1.name = '' +f3d_mat.combiner1.A = 'TEXEL0' +f3d_mat.combiner1.B = '0' +f3d_mat.combiner1.C = 'TEXEL1' +f3d_mat.combiner1.D = '0' +f3d_mat.combiner1.A_alpha = 'TEXEL0' +f3d_mat.combiner1.B_alpha = '0' +f3d_mat.combiner1.C_alpha = 'TEXEL1' +f3d_mat.combiner1.D_alpha = '0' +f3d_mat.combiner2.name = '' +f3d_mat.combiner2.A = 'SHADE' +f3d_mat.combiner2.B = 'PRIMITIVE' +f3d_mat.combiner2.C = 'COMBINED' +f3d_mat.combiner2.D = 'PRIMITIVE' +f3d_mat.combiner2.A_alpha = 'COMBINED' +f3d_mat.combiner2.B_alpha = '0' +f3d_mat.combiner2.C_alpha = 'PRIMITIVE' +f3d_mat.combiner2.D_alpha = 'SHADE' +f3d_mat.tex0.name = '' +f3d_mat.tex0.tex_set = True +f3d_mat.tex1.name = '' +f3d_mat.tex1.tex_set = True +f3d_mat.set_prim = True +f3d_mat.set_lights = False +f3d_mat.set_env = True +f3d_mat.set_blend = False +f3d_mat.set_key = True +f3d_mat.set_k0_5 = True +f3d_mat.set_combiner = True +f3d_mat.use_default_lighting = True +f3d_mat.blend_color = (0.0, 0.0, 0.0, 1.0) +f3d_mat.prim_color = (0.10837142914533615, 0.24593788385391235, 0.5403782725334167, 1.0) +f3d_mat.env_color = (1.0, 1.0, 1.0, 1.0) +f3d_mat.key_center = (0.5, 0.5, 0.5, 1.0) +f3d_mat.key_scale = (0.0, 0.0, 0.0) +f3d_mat.key_width = (0.0, 0.0, 0.0) +f3d_mat.k0 = 0.686274528503418 +f3d_mat.k1 = -0.16862745583057404 +f3d_mat.k2 = -0.3490196168422699 +f3d_mat.k3 = 0.8705882430076599 +f3d_mat.k4 = 0.4470588266849518 +f3d_mat.k5 = 0.16470588743686676 +f3d_mat.prim_lod_frac = 0.0 +f3d_mat.prim_lod_min = 0.0 +f3d_mat.default_light_color = (1.0, 1.0, 1.0, 1.0) +f3d_mat.set_ambient_from_light = True +f3d_mat.ambient_light_color = (0.2140410989522934, 0.2140410989522934, 0.2140410989522934, 1.0) +f3d_mat.f3d_light1 = None +f3d_mat.f3d_light2 = None +f3d_mat.f3d_light3 = None +f3d_mat.f3d_light4 = None +f3d_mat.f3d_light5 = None +f3d_mat.f3d_light6 = None +f3d_mat.f3d_light7 = None +f3d_mat.ao_ambient = 1.0 +f3d_mat.ao_directional = 0.625 +f3d_mat.ao_point = 0.0 +f3d_mat.set_ao = False +f3d_mat.fresnel_lo = 0.699999988079071 +f3d_mat.fresnel_hi = 0.20000000298023224 +f3d_mat.set_fresnel = True +f3d_mat.attroffs_st = (0.0, 0.0) +f3d_mat.attroffs_z = -2 +f3d_mat.set_attroffs_st = False +f3d_mat.set_attroffs_z = False +f3d_mat.fog_color = (0.0, 0.0, 0.0, 1.0) +f3d_mat.fog_position = (985, 1000) +f3d_mat.set_fog = False +f3d_mat.use_global_fog = True +f3d_mat.rdp_settings.name = '' +f3d_mat.rdp_settings.g_zbuffer = True +f3d_mat.rdp_settings.g_shade = True +f3d_mat.rdp_settings.g_ambocclusion = False +f3d_mat.rdp_settings.g_attroffset_z_enable = False +f3d_mat.rdp_settings.g_attroffset_st_enable = False +f3d_mat.rdp_settings.g_cull_front = False +f3d_mat.rdp_settings.g_cull_back = False +f3d_mat.rdp_settings.g_packed_normals = False +f3d_mat.rdp_settings.g_lighttoalpha = False +f3d_mat.rdp_settings.g_lighting_specular = True +f3d_mat.rdp_settings.g_fresnel_color = False +f3d_mat.rdp_settings.g_fresnel_alpha = True +f3d_mat.rdp_settings.g_fog = False +f3d_mat.rdp_settings.g_lighting = True +f3d_mat.rdp_settings.g_tex_gen = False +f3d_mat.rdp_settings.g_tex_gen_linear = False +f3d_mat.rdp_settings.g_lod = False +f3d_mat.rdp_settings.g_shade_smooth = True +f3d_mat.rdp_settings.g_clipping = False +f3d_mat.rdp_settings.g_mdsft_alpha_dither = 'G_AD_NOISE' +f3d_mat.rdp_settings.g_mdsft_rgb_dither = 'G_CD_MAGICSQ' +f3d_mat.rdp_settings.g_mdsft_combkey = 'G_CK_NONE' +f3d_mat.rdp_settings.g_mdsft_textconv = 'G_TC_FILT' +f3d_mat.rdp_settings.g_mdsft_text_filt = 'G_TF_BILERP' +f3d_mat.rdp_settings.g_mdsft_textlut = 'G_TT_NONE' +f3d_mat.rdp_settings.g_mdsft_textlod = 'G_TL_TILE' +f3d_mat.rdp_settings.num_textures_mipmapped = 2 +f3d_mat.rdp_settings.g_mdsft_textdetail = 'G_TD_CLAMP' +f3d_mat.rdp_settings.g_mdsft_textpersp = 'G_TP_PERSP' +f3d_mat.rdp_settings.g_mdsft_cycletype = 'G_CYC_2CYCLE' +f3d_mat.rdp_settings.g_mdsft_color_dither = 'G_CD_ENABLE' +f3d_mat.rdp_settings.g_mdsft_pipeline = 'G_PM_NPRIMITIVE' +f3d_mat.rdp_settings.g_mdsft_alpha_compare = 'G_AC_NONE' +f3d_mat.rdp_settings.g_mdsft_zsrcsel = 'G_ZS_PIXEL' +f3d_mat.rdp_settings.prim_depth.name = '' +f3d_mat.rdp_settings.prim_depth.z = 0 +f3d_mat.rdp_settings.prim_depth.dz = 0 +f3d_mat.rdp_settings.clip_ratio = 1 +f3d_mat.rdp_settings.set_rendermode = True +f3d_mat.rdp_settings.rendermode_advanced_enabled = True +f3d_mat.rdp_settings.rendermode_preset_cycle_1 = 'G_RM_NOOP' +f3d_mat.rdp_settings.rendermode_preset_cycle_2 = 'G_RM_AA_ZB_XLU_SURF2' +f3d_mat.rdp_settings.aa_en = True +f3d_mat.rdp_settings.z_cmp = True +f3d_mat.rdp_settings.z_upd = False +f3d_mat.rdp_settings.im_rd = True +f3d_mat.rdp_settings.clr_on_cvg = True +f3d_mat.rdp_settings.cvg_dst = 'CVG_DST_WRAP' +f3d_mat.rdp_settings.zmode = 'ZMODE_INTER' +f3d_mat.rdp_settings.cvg_x_alpha = False +f3d_mat.rdp_settings.alpha_cvg_sel = False +f3d_mat.rdp_settings.force_bl = True +f3d_mat.rdp_settings.blend_p1 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_p2 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_m1 = 'G_BL_CLR_IN' +f3d_mat.rdp_settings.blend_m2 = 'G_BL_CLR_MEM' +f3d_mat.rdp_settings.blend_a1 = 'G_BL_A_IN' +f3d_mat.rdp_settings.blend_a2 = 'G_BL_A_IN' +f3d_mat.rdp_settings.blend_b1 = 'G_BL_1MA' +f3d_mat.rdp_settings.blend_b2 = 'G_BL_1MA' +f3d_mat.draw_layer.name = '' +f3d_mat.draw_layer.sm64 = '5' +f3d_mat.draw_layer.oot = 'Transparent' +f3d_mat.large_edges = 'Clamp' +f3d_mat.expand_cel_shading_ui = False +f3d_mat.use_cel_shading = False +f3d_mat.cel_shading.name = '' +f3d_mat.cel_shading.tintPipeline = 'CC' +f3d_mat.cel_shading.cutoutSource = 'ENVIRONMENT' +f3d_mat.cel_shading.levels.clear() +bpy.context.material.f3d_update_flag = False +f3d_mat.use_default_lighting = f3d_mat.use_default_lighting # Force nodes update +""" + material_presets = { "oot": { "oot_shaded_environment_mapped": oot_shaded_environment_mapped, @@ -4932,12 +7332,28 @@ material_presets = { "oot_vertex_colored_texture_cutout": oot_vertex_colored_texture_cutout, "oot_vertex_colored_texture_transparent": oot_vertex_colored_texture_transparent, }, - "oot_cel": { - "oot_cel_shaded_4_blend_tex_vcol_ao": oot_cel_shaded_4_blend_tex_vcol_ao, - "oot_cel_shaded_blend_tex_vcol_ltcol": oot_cel_shaded_blend_tex_vcol_ltcol, - "oot_cel_shaded_blend_tex_vcol_ltcol_ao": oot_cel_shaded_blend_tex_vcol_ltcol_ao, - "oot_cel_shaded_blend_vcol": oot_cel_shaded_blend_vcol, - "oot_cel_shaded_mul_tex": oot_cel_shaded_mul_tex, + "oot_f3dex3": { + "oot_cel_4_blend_tex_vcol_ao": oot_cel_4_blend_tex_vcol_ao, + "oot_cel_blend_tex_vcol_ltcol": oot_cel_blend_tex_vcol_ltcol, + "oot_cel_blend_tex_vcol_ltcol_ao": oot_cel_blend_tex_vcol_ltcol_ao, + "oot_cel_blend_vcol": oot_cel_blend_vcol, + "oot_cel_mul_tex": oot_cel_mul_tex, + "oot_ghost_fresnel": oot_ghost_fresnel, + "oot_ghost_texture_fresnel": oot_ghost_texture_fresnel, + "oot_glass_specular_fresnel": oot_glass_specular_fresnel, + "oot_shaded_solid_ao": oot_shaded_solid_ao, + "oot_shaded_solid_ao_transparent": oot_shaded_solid_ao_transparent, + "oot_shaded_specular_vcol_texture": oot_shaded_specular_vcol_texture, + "oot_shaded_vcol_multitexture_lerp_ao": oot_shaded_vcol_multitexture_lerp_ao, + "oot_shaded_vcol_multitexture_lerp_ao_transparent": oot_shaded_vcol_multitexture_lerp_ao_transparent, + "oot_shaded_vcol_multitexture_lerp_transparent_vertex_alpha": oot_shaded_vcol_multitexture_lerp_transparent_vertex_alpha, + "oot_shaded_vcol_solid_ao": oot_shaded_vcol_solid_ao, + "oot_shaded_vcol_solid_ao_transparent": oot_shaded_vcol_solid_ao_transparent, + "oot_shaded_vcol_texture_ao": oot_shaded_vcol_texture_ao, + "oot_shaded_vcol_texture_ao_transparent": oot_shaded_vcol_texture_ao_transparent, + "oot_shaded_vcol_texture_transparent_vertex_alpha": oot_shaded_vcol_texture_transparent_vertex_alpha, + "oot_water_lerp_specular_fresnel": oot_water_lerp_specular_fresnel, + "oot_water_mult_specular_fresnel": oot_water_mult_specular_fresnel, }, "sm64": { "sm64_decal": sm64_decal, From 45781275093f7d372d2c0d9b2bee93ed329217e1 Mon Sep 17 00:00:00 2001 From: Sauraen Date: Sun, 17 Dec 2023 21:53:15 -0800 Subject: [PATCH 63/74] Updated readmes --- README.md | 19 +++++++++++++++++-- fast64_internal/oot/README.md | 15 +++++++-------- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 81c3052..6165094 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Fast64 -This requires Blender 3.2+. +This requires Blender 3.2+. Blender 4.0+ is recommended. Forked from [kurethedead/fast64 on BitBucket](https://bitbucket.org/kurethedead/fast64/src). @@ -22,7 +22,7 @@ Thanks to InTheBeef for LowPolySkinnedMario. ### Discord Server We have a Discord server for support as well as development [here](https://discord.gg/ny7PDcN2x8). -### Table of Contents +### Links to Docs / Guides for Each Game 1. [ Super Mario 64 ](/fast64_internal/sm64/README.md) 2. [ Ocarina Of Time ](/fast64_internal/oot/README.md) @@ -48,6 +48,21 @@ There may occur cases where code is formatted differently based on the code use ### Converting To F3D v5 Materials A new optimized shader graph was introduced to decrease processing times for material creation and exporting. If you have a project that still uses old materials, you may want to convert them to v5. To convert an old project, click the "Recreate F3D Materials As V5" operator near the top of the Fast64 tab in 3D view. This may take a while depending on the number of materials in the project. Then go to the outliner, change the display mode to "Orphan Data" (broken heart icon), then click "Purge" in the top right corner. Purge multiple times until all of the old node groups are gone. +### F3DEX3 Features + +fast64 supports exporting data for [F3DEX3](https://github.com/HackerN64/F3DEX3), a modded microcode which brings many new features and higher performance. **Preview of these new features in the 3D view is not currently supported**, but they will be exported correctly. To modify the vertex colors of an object with a material which is using packed normals (shading/lighting and vertex colors together), temporarily switch to a vertex colored preset or uncheck `Lighting` in the material geometry mode settings. Once the vertex colors are painted how you want them, re-enable `Lighting` and `Packed Normals`. + +Selecting F3DEX3 as your microcode unlocks a large number of additional presets based on F3DEX3 features. For more information on all these features, see the F3DEX3 readme, GBI, and [these videos](https://www.youtube.com/playlist?list=PLU2OUGtyQi6QswDQOXWIMaYFUcgQ9Psvm). The preset names get very long and are abbreviated as follows: +- `Shaded`: Computes lighting, which normally affects shade color. +- `Vcol`: Vertex colors are enabled in addition to lighting; normally these are multiplied together to become shade color. +- `Ao`: Ambient occlusion. +- `Cel`: Cel shading. If followed by a number, this is the number of cel levels. +- `Ltcol`: Cel shading tints are loaded from light colors. +- `Blend` vs. `Mul` for cel shading: Whether to apply the tint in the blender with linear interpolation, or by multiplication in the CC. The latter sometimes looks better, but does not support vertex colors. +- `Lerp` vs. `Mult` for multitexture (water): Whether the two textures are combined by linear interpolation or multiplication. + +For cel shading, it is recommended to start with one of the cel shading presets, then modify the settings under the `Use Cel Shading` panel. Hover over each UI control for additional information about how that setting works. + ### Updater Fast64 features an updater ([CGCookie/blender-addon-updater](https://github.com/CGCookie/blender-addon-updater)). diff --git a/fast64_internal/oot/README.md b/fast64_internal/oot/README.md index 9e73267..2abed3b 100644 --- a/fast64_internal/oot/README.md +++ b/fast64_internal/oot/README.md @@ -14,17 +14,17 @@ 11. [Cutscenes](#cutscenes) ### Getting Started -1. In the 3D view properties sidebar, go to the ``Fast64`` tab, then ``Fast64 Global Settings`` and set ``Game`` to ``OOT``. -2. Set ``F3D Microcode`` to ``F3DEX2/LX2``. -3. Switch to the ``OOT`` tab. In ``OOT File Settings``, set your decomp path to the path of your [OoT Decomp](https://github.com/zeldaret/oot/) repository on disk. -4. In ``OOT Tools``, click "Add Scene" to create a basic scene. +1. In the 3D view properties sidebar (press `n`), go to the ``Fast64`` tab, then ``Fast64 Global Settings`` and set ``Game`` to ``OOT``. +2. Switch to the ``OOT`` tab. In ``OOT File Settings``, set your decomp path to the path of your [HackerOoT (recommended)](https://github.com/HackerN64/HackerOoT) or [OoT Decomp](https://github.com/zeldaret/oot/) repository on disk. Check `Enable HackerOoT Features` if using HackerOoT. +3. In ``OOT Tools``, click `Add Scene` to create a basic scene. +4. Press `a` so that everything is selected, then click `Clear Transform`. 5. In ``OOT Scene Exporter`` you can choose the scene to replace or add. Some scenes have some hardcoded things that will cause them to break, so choose something like ``Market Entrance (Child Day) (Entra)``. - To add a custom scene choose ``Custom`` in the scene search box, then choose in which folder you want to export the scene and which name you want it to be (note that Fast64 will force the scene name to be lower-case). +- Enable ``Export as Single File`` if you want to have your scene in the same format as the other ones in decomp. 6. Make sure you selected the right scene in ``Scene Object`` then click "Export Scene" to export it. When you click ``Add Scene`` this is set automatically. -7. Compile and run the game. This was tested for commit ef56b01. +7. Compile and run the game. 8. (Optional) In the ``View`` tab you may want to increase the ``Clip End`` value. -9. Note: You can enable ``Export as Single File`` if you want to have your scene in the same format as the other ones in decomp. -10. Note: You can read [this code](https://github.com/Dragorn421/oot/tree/mod_base_for_mods) to take a glance at what you can do for quality of life for testing. +9. Note: You can read [this code](https://github.com/Dragorn421/oot/tree/mod_base_for_mods) to take a glance at what you can do for quality of life for testing. ### Scene Overview In Blender, the "empty" object type is used to define different types of OOT data, including scenes and rooms. @@ -185,4 +185,3 @@ If the camera preview in Blender isn't following where you have the bones or if 1. Make sure your scene empty object, room empty object, and cutscene empty object are all at the Blender origin. You can usually do this with a combination of Object > Clear > Origin and Alt+G. Maybe Object > Apply > All Transforms if that doesn't work. If your room empty object is 1 meter below your scene empty object, as fast64 does by default, that offset will be applied to everything in game and then the zcamedit stuff will not be at the correct relative position. 2. If you moved / rotated / etc. one of the camera shots / armatures in object mode, this transformation will be ignored. You can fix this by selecting the shot / armature in object mode and clicking Object > Apply > All Transforms. That will convert the transform to actual changed positions for each bone. - From 2a86902b603112736a3ec91fbafe318064263ae1 Mon Sep 17 00:00:00 2001 From: Sauraen Date: Sun, 17 Dec 2023 22:04:44 -0800 Subject: [PATCH 64/74] Cleaned up some import repeated code --- fast64_internal/f3d/f3d_parser.py | 20 ++++++++++---------- fast64_internal/utility.py | 4 ++++ 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/fast64_internal/f3d/f3d_parser.py b/fast64_internal/f3d/f3d_parser.py index 0fd2593..29aaa8b 100644 --- a/fast64_internal/f3d/f3d_parser.py +++ b/fast64_internal/f3d/f3d_parser.py @@ -1588,26 +1588,26 @@ class F3DContext: elif command.name[:13] == "gsSPSetLights": self.setLights(dlData, command) elif command.name == "gsSPAmbOcclusionAmb": - mat.ao_ambient = float(int(command.params[0], 0)) / (2**16) + mat.ao_ambient = float_from_u16_str(command.params[0]) mat.set_ao = True elif command.name == "gsSPAmbOcclusionDir": - mat.ao_directional = float(int(command.params[0], 0)) / (2**16) + mat.ao_directional = float_from_u16_str(command.params[0]) mat.set_ao = True elif command.name == "gsSPAmbOcclusionPoint": - mat.ao_point = float(int(command.params[0], 0)) / (2**16) + mat.ao_point = float_from_u16_str(command.params[0]) mat.set_ao = True elif command.name == "gsSPAmbOcclusionAmbDir": - mat.ao_ambient = float(int(command.params[0], 0)) / (2**16) - mat.ao_directional = float(int(command.params[1], 0)) / (2**16) + mat.ao_ambient = float_from_u16_str(command.params[0]) + mat.ao_directional = float_from_u16_str(command.params[1]) mat.set_ao = True elif command.name == "gsSPAmbOcclusionDirPoint": - mat.ao_directional = float(int(command.params[0], 0)) / (2**16) - mat.ao_point = float(int(command.params[1], 0)) / (2**16) + mat.ao_directional = float_from_u16_str(command.params[0]) + mat.ao_point = float_from_u16_str(command.params[1]) mat.set_ao = True elif command.name == "gsSPAmbOcclusion": - mat.ao_ambient = float(int(command.params[0], 0)) / (2**16) - mat.ao_directional = float(int(command.params[1], 0)) / (2**16) - mat.ao_point = float(int(command.params[2], 0)) / (2**16) + mat.ao_ambient = float_from_u16_str(command.params[0]) + mat.ao_directional = float_from_u16_str(command.params[1]) + mat.ao_point = float_from_u16_str(command.params[2]) mat.set_ao = True elif command.name == "gsSPFresnel": scale = int_from_s16_str(command.params[0]) diff --git a/fast64_internal/utility.py b/fast64_internal/utility.py index 374ecd1..150cd46 100644 --- a/fast64_internal/utility.py +++ b/fast64_internal/utility.py @@ -610,6 +610,10 @@ def int_from_s16(value: int) -> int: def int_from_s16_str(value: str) -> int: return int_from_s16(int(value, 0)) + + +def float_from_u16_str(value: str) -> float: + return float(int(value, 0)) / (2**16) def decompFolderMessage(layout): From 32ef75370b03e6c939c171f87b8d0c3979cd2023 Mon Sep 17 00:00:00 2001 From: Sauraen Date: Mon, 25 Dec 2023 11:03:54 -0800 Subject: [PATCH 65/74] Update README.md Co-authored-by: Yanis42 <35189056+Yanis42@users.noreply.github.com> --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6165094..5e21ef4 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ A new optimized shader graph was introduced to decrease processing times for mat ### F3DEX3 Features -fast64 supports exporting data for [F3DEX3](https://github.com/HackerN64/F3DEX3), a modded microcode which brings many new features and higher performance. **Preview of these new features in the 3D view is not currently supported**, but they will be exported correctly. To modify the vertex colors of an object with a material which is using packed normals (shading/lighting and vertex colors together), temporarily switch to a vertex colored preset or uncheck `Lighting` in the material geometry mode settings. Once the vertex colors are painted how you want them, re-enable `Lighting` and `Packed Normals`. +Fast64 supports exporting data for [F3DEX3](https://github.com/HackerN64/F3DEX3), a modded microcode which brings many new features and higher performance. **Preview of these new features in the 3D view is not currently supported**, but they will be exported correctly. To modify the vertex colors of an object with a material which is using packed normals (shading/lighting and vertex colors together), temporarily switch to a vertex colored preset or uncheck `Lighting` in the material geometry mode settings. Once the vertex colors are painted how you want them, re-enable `Lighting` and `Packed Normals`. Selecting F3DEX3 as your microcode unlocks a large number of additional presets based on F3DEX3 features. For more information on all these features, see the F3DEX3 readme, GBI, and [these videos](https://www.youtube.com/playlist?list=PLU2OUGtyQi6QswDQOXWIMaYFUcgQ9Psvm). The preset names get very long and are abbreviated as follows: - `Shaded`: Computes lighting, which normally affects shade color. From 17eca63b14203644da259908eee674626ba413f5 Mon Sep 17 00:00:00 2001 From: Sauraen Date: Mon, 25 Dec 2023 11:11:17 -0800 Subject: [PATCH 66/74] Minor tweak to readme --- fast64_internal/oot/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fast64_internal/oot/README.md b/fast64_internal/oot/README.md index 2abed3b..e336c3d 100644 --- a/fast64_internal/oot/README.md +++ b/fast64_internal/oot/README.md @@ -14,7 +14,7 @@ 11. [Cutscenes](#cutscenes) ### Getting Started -1. In the 3D view properties sidebar (press `n`), go to the ``Fast64`` tab, then ``Fast64 Global Settings`` and set ``Game`` to ``OOT``. +1. In the 3D view properties sidebar (default hotkey to show this is `n` in the viewport), go to the ``Fast64`` tab, then ``Fast64 Global Settings`` and set ``Game`` to ``OOT``. 2. Switch to the ``OOT`` tab. In ``OOT File Settings``, set your decomp path to the path of your [HackerOoT (recommended)](https://github.com/HackerN64/HackerOoT) or [OoT Decomp](https://github.com/zeldaret/oot/) repository on disk. Check `Enable HackerOoT Features` if using HackerOoT. 3. In ``OOT Tools``, click `Add Scene` to create a basic scene. 4. Press `a` so that everything is selected, then click `Clear Transform`. From 3796424885f2fb401d8ded2f57ff534731a4ff9e Mon Sep 17 00:00:00 2001 From: Yanis42 <35189056+Yanis42@users.noreply.github.com> Date: Mon, 25 Dec 2023 20:38:08 +0100 Subject: [PATCH 67/74] (forgot to add this change to the merge commit) --- fast64_internal/oot/props_panel_main.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/fast64_internal/oot/props_panel_main.py b/fast64_internal/oot/props_panel_main.py index 465877b..ef3d14a 100644 --- a/fast64_internal/oot/props_panel_main.py +++ b/fast64_internal/oot/props_panel_main.py @@ -29,7 +29,15 @@ ootEnumEmptyType = [ ("Water Box", "Water Box", "Water Box"), ("Cull Group", "Custom Cull Group", "Cull Group"), ("LOD", "LOD Group", "LOD Group"), - ("Cutscene", "Cutscene", "Cutscene"), + ("Cutscene", "Cutscene Main", "Cutscene"), + ("CS Actor Cue List", "CS Actor Cue List", "CS Actor Cue List"), + ("CS Actor Cue", "CS Actor Cue", "CS Actor Cue"), + ("CS Player Cue List", "CS Player Cue List", "CS Player Cue List"), + ("CS Player Cue", "CS Player Cue", "CS Player Cue"), + ("CS Actor Cue Preview", "CS Actor Cue Preview", "CS Actor Cue Preview"), + ("CS Player Cue Preview", "CS Player Cue Preview", "CS Player Cue Preview"), + ("CS Dummy Cue", "CS Dummy Cue", "CS Dummy Cue"), + # ('Camera Volume', 'Camera Volume', 'Camera Volume'), ] From 52341d0a63a15d877deabacd1e098e9f96370718 Mon Sep 17 00:00:00 2001 From: Yanis42 <35189056+Yanis42@users.noreply.github.com> Date: Mon, 25 Dec 2023 20:45:23 +0100 Subject: [PATCH 68/74] tie room on scene creation --- fast64_internal/oot/tools/operators.py | 1 + 1 file changed, 1 insertion(+) diff --git a/fast64_internal/oot/tools/operators.py b/fast64_internal/oot/tools/operators.py index 6e5f1df..8d8228c 100644 --- a/fast64_internal/oot/tools/operators.py +++ b/fast64_internal/oot/tools/operators.py @@ -95,6 +95,7 @@ class OOT_AddScene(Operator): roomObj = context.view_layer.objects.active roomObj.ootEmptyType = "Room" roomObj.name = "Room" + entranceObj.ootEntranceProperty.tiedRoom = roomObj parentObject(roomObj, planeObj) location += Vector([0, 0, 2]) From 2d6f0aba827f5358129b5e6a3ea813d39d546bdc Mon Sep 17 00:00:00 2001 From: Sauraen Date: Mon, 25 Dec 2023 12:31:26 -0800 Subject: [PATCH 69/74] Fix SM64 default light direction for F3DEX3 compatibility --- fast64_internal/f3d/f3d_parser.py | 30 +++++++++++++++--------------- fast64_internal/f3d/f3d_writer.py | 2 +- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/fast64_internal/f3d/f3d_parser.py b/fast64_internal/f3d/f3d_parser.py index 29aaa8b..cb3f973 100644 --- a/fast64_internal/f3d/f3d_parser.py +++ b/fast64_internal/f3d/f3d_parser.py @@ -513,13 +513,13 @@ class F3DContext: # Here these are ints, but when parsing the values will be normalized. self.lights.l = [ - Light([0, 0, 0], [0x28, 0x28, 0x28]), - Light([0, 0, 0], [0x28, 0x28, 0x28]), - Light([0, 0, 0], [0x28, 0x28, 0x28]), - Light([0, 0, 0], [0x28, 0x28, 0x28]), - Light([0, 0, 0], [0x28, 0x28, 0x28]), - Light([0, 0, 0], [0x28, 0x28, 0x28]), - Light([0, 0, 0], [0x28, 0x28, 0x28]), + Light([0, 0, 0], [0x49, 0x49, 0x49]), + Light([0, 0, 0], [0x49, 0x49, 0x49]), + Light([0, 0, 0], [0x49, 0x49, 0x49]), + Light([0, 0, 0], [0x49, 0x49, 0x49]), + Light([0, 0, 0], [0x49, 0x49, 0x49]), + Light([0, 0, 0], [0x49, 0x49, 0x49]), + Light([0, 0, 0], [0x49, 0x49, 0x49]), ] self.lights.a = Ambient([0, 0, 0]) self.numLights: int = 0 @@ -579,13 +579,13 @@ class F3DContext: self.lights = Lights("lights_context", self.f3d) self.lights.l = [ - Light([0, 0, 0], [0x28, 0x28, 0x28]), - Light([0, 0, 0], [0x28, 0x28, 0x28]), - Light([0, 0, 0], [0x28, 0x28, 0x28]), - Light([0, 0, 0], [0x28, 0x28, 0x28]), - Light([0, 0, 0], [0x28, 0x28, 0x28]), - Light([0, 0, 0], [0x28, 0x28, 0x28]), - Light([0, 0, 0], [0x28, 0x28, 0x28]), + Light([0, 0, 0], [0x49, 0x49, 0x49]), + Light([0, 0, 0], [0x49, 0x49, 0x49]), + Light([0, 0, 0], [0x49, 0x49, 0x49]), + Light([0, 0, 0], [0x49, 0x49, 0x49]), + Light([0, 0, 0], [0x49, 0x49, 0x49]), + Light([0, 0, 0], [0x49, 0x49, 0x49]), + Light([0, 0, 0], [0x49, 0x49, 0x49]), ] self.lights.a = Ambient([0, 0, 0]) self.numLights = 0 @@ -1281,7 +1281,7 @@ class F3DContext: lightList.append(Light(color, direction)) while len(lightList) < 7: - lightList.append(Light(Vector([0, 0, 0]), Vector([0x28, 0x28, 0x28]))) + lightList.append(Light(Vector([0, 0, 0]), Vector([0x49, 0x49, 0x49]))) # normally a and l are Ambient and Light objects, # but here they will be a color and blender light object array. diff --git a/fast64_internal/f3d/f3d_writer.py b/fast64_internal/f3d/f3d_writer.py index dcd1322..806be6e 100644 --- a/fast64_internal/f3d/f3d_writer.py +++ b/fast64_internal/f3d/f3d_writer.py @@ -1438,7 +1438,7 @@ def saveLightsDefinition(fModel, fMaterial, material, lightsName): if material.use_default_lighting: lights.a = Ambient(exportColor(material.ambient_light_color)) - lights.l.append(Light(exportColor(material.default_light_color), [0x28, 0x28, 0x28])) + lights.l.append(Light(exportColor(material.default_light_color), [0x49, 0x49, 0x49])) else: lights.a = Ambient(exportColor(material.ambient_light_color)) From 6d966200bf8daea9cc8df5e36a09a7333916513b Mon Sep 17 00:00:00 2001 From: Yanis42 <35189056+Yanis42@users.noreply.github.com> Date: Tue, 26 Dec 2023 00:02:53 +0100 Subject: [PATCH 70/74] flipped default for `isRoomTransition` --- fast64_internal/oot/actor/properties.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fast64_internal/oot/actor/properties.py b/fast64_internal/oot/actor/properties.py index 8f55351..e005a45 100644 --- a/fast64_internal/oot/actor/properties.py +++ b/fast64_internal/oot/actor/properties.py @@ -163,7 +163,7 @@ class OOTTransitionActorProperty(PropertyGroup): cameraTransitionFrontCustom: StringProperty(default="0x00") cameraTransitionBack: EnumProperty(items=ootEnumCamTransition, default="0x00") cameraTransitionBackCustom: StringProperty(default="0x00") - isRoomTransition: BoolProperty(name="Is Room Transition", default=False) + isRoomTransition: BoolProperty(name="Is Room Transition", default=True) actor: PointerProperty(type=OOTActorProperty) From 03e517ae4b4e8554722bcdfb250c06b7688f64f1 Mon Sep 17 00:00:00 2001 From: Yanis42 <35189056+Yanis42@users.noreply.github.com> Date: Tue, 26 Dec 2023 00:35:24 +0100 Subject: [PATCH 71/74] safety thing --- fast64_internal/oot/oot_level_parser.py | 1 + 1 file changed, 1 insertion(+) diff --git a/fast64_internal/oot/oot_level_parser.py b/fast64_internal/oot/oot_level_parser.py index 284c797..6a958f5 100644 --- a/fast64_internal/oot/oot_level_parser.py +++ b/fast64_internal/oot/oot_level_parser.py @@ -735,6 +735,7 @@ def parseTransActorList( transActorProp.toRoom = toRoom transActorProp.isRoomTransition = True else: + transActorProp.isRoomTransition = False parentObject(toRoom, actorObj) setCustomProperty(transActorProp, "cameraTransitionFront", camFront, ootEnumCamTransition) From 3d46ed4e73fca9201f6534ff11b42bb612ed60b7 Mon Sep 17 00:00:00 2001 From: Yanis42 <35189056+Yanis42@users.noreply.github.com> Date: Tue, 26 Dec 2023 00:45:10 +0100 Subject: [PATCH 72/74] properly handle missing room object error on export --- fast64_internal/oot/oot_level_writer.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fast64_internal/oot/oot_level_writer.py b/fast64_internal/oot/oot_level_writer.py index e82fa3a..f8e6b9e 100644 --- a/fast64_internal/oot/oot_level_writer.py +++ b/fast64_internal/oot/oot_level_writer.py @@ -783,6 +783,8 @@ def ootProcessEmpties(scene, room, sceneObj, obj, transformMatrix): transActorProp = obj.ootTransitionActorProperty if transActorProp.actor.actorID != "None": if transActorProp.isRoomTransition: + if transActorProp.fromRoom is None or transActorProp.toRoom is None: + raise PluginError("ERROR: Missing room empty object assigned to transition.") fromIndex = transActorProp.fromRoom.ootRoomHeader.roomIndex toIndex = transActorProp.toRoom.ootRoomHeader.roomIndex else: From 729f7534b03353f0091d51aa15169a2e927b38d8 Mon Sep 17 00:00:00 2001 From: Yanis42 <35189056+Yanis42@users.noreply.github.com> Date: Tue, 26 Dec 2023 01:13:03 +0100 Subject: [PATCH 73/74] review --- fast64_internal/oot/oot_level_writer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fast64_internal/oot/oot_level_writer.py b/fast64_internal/oot/oot_level_writer.py index 0c9320b..6dbd0fe 100644 --- a/fast64_internal/oot/oot_level_writer.py +++ b/fast64_internal/oot/oot_level_writer.py @@ -824,7 +824,7 @@ def ootProcessEmpties(scene, room, sceneObj, obj, transformMatrix): if entranceProp.tiedRoom is not None: roomIndex = entranceProp.tiedRoom.ootRoomHeader.roomIndex else: - raise PluginError("ERROR: The room isn't set!") + raise PluginError("ERROR: Missing room empty object assigned to entrance.") addActor(scene, OOTEntrance(roomIndex, spawnIndex), entranceProp.actor, "entranceList", obj.name) addStartPosition( From 6ccba6e12aa09c62db1a1282a6af6f88b3ce09f6 Mon Sep 17 00:00:00 2001 From: Yanis42 <35189056+Yanis42@users.noreply.github.com> Date: Tue, 26 Dec 2023 01:13:48 +0100 Subject: [PATCH 74/74] missing word in the error message --- fast64_internal/oot/oot_level_writer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fast64_internal/oot/oot_level_writer.py b/fast64_internal/oot/oot_level_writer.py index 6dbd0fe..adf72f8 100644 --- a/fast64_internal/oot/oot_level_writer.py +++ b/fast64_internal/oot/oot_level_writer.py @@ -824,7 +824,7 @@ def ootProcessEmpties(scene, room, sceneObj, obj, transformMatrix): if entranceProp.tiedRoom is not None: roomIndex = entranceProp.tiedRoom.ootRoomHeader.roomIndex else: - raise PluginError("ERROR: Missing room empty object assigned to entrance.") + raise PluginError("ERROR: Missing room empty object assigned to the entrance.") addActor(scene, OOTEntrance(roomIndex, spawnIndex), entranceProp.actor, "entranceList", obj.name) addStartPosition(