Freeze and Identify

- Ponder scenes can now be paused and analysed, viewing tooltips for targeted blocks in the scene
- During editing, identify mode can be used to move targeted positions to the clipboard
- Ponder-compatible components can be pondered about in identify mode
This commit is contained in:
simibubi 2021-02-28 01:34:56 +01:00
parent 692c6deaaf
commit 43f0ad1c78
41 changed files with 547 additions and 345 deletions

View file

@ -401,19 +401,19 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j
7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json
b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json
e3f618c5b622d21880de858678d1802cbf65e615 assets/create/lang/en_ud.json
187d765fed859da0aa91e67d35b18589882ae179 assets/create/lang/en_us.json
d9dc6a731465072a69754252c9097bfc83f2e0b8 assets/create/lang/unfinished/de_de.json
ae5554d2809e669e80f455abd0e67a764fff31da assets/create/lang/unfinished/es_es.json
e17b3b528004939b86009e3f88679555f33fbc90 assets/create/lang/unfinished/es_mx.json
4f385f92b948be135e268bf7f6f71e346266128d assets/create/lang/unfinished/fr_fr.json
1662dcbf578c71c8f2c92dff276766d1b80eae8c assets/create/lang/unfinished/it_it.json
53e51f744fd205abfd6cb69ba213d0ba867b1e95 assets/create/lang/unfinished/ja_jp.json
75cf95c526518a104c7a1289a4ce529d2d8ffde1 assets/create/lang/unfinished/ko_kr.json
e76bf18f466986aadd4b53991267305755ce299c assets/create/lang/unfinished/nl_nl.json
06370d657c5967e43df0f4925b3c5b06844a9172 assets/create/lang/unfinished/pt_br.json
586f3041725e75e02d440f233c12df3be879cecf assets/create/lang/unfinished/ru_ru.json
bbb874798f5125d4870e31bf6636f8e9b40a40b0 assets/create/lang/unfinished/zh_cn.json
e3aeeeaccee348630734c63fcbc3e3bea0af6663 assets/create/lang/unfinished/zh_tw.json
07eaea807200c157af29adbbc411d2a80b9cade5 assets/create/lang/en_us.json
3f89caaa4c6ac34222ebd1d5577139c18a9aa6b8 assets/create/lang/unfinished/de_de.json
591db95e6cd9e9f3f106ef4dc1f9ce475edee4df assets/create/lang/unfinished/es_es.json
ee7da78e00b92e5fde92c8ad8b25627bb7f478c7 assets/create/lang/unfinished/es_mx.json
3b604e06a29ddac65e71e4b853e88066496b3118 assets/create/lang/unfinished/fr_fr.json
d50db792720189290b382537f2703d08feab7f52 assets/create/lang/unfinished/it_it.json
2969a487f270d80969d69a5f76cef7e1b41c5c9e assets/create/lang/unfinished/ja_jp.json
5df95bcadb862b4522439ea66dc28a018771562b assets/create/lang/unfinished/ko_kr.json
9f65db261fdda1c22691b5238a8327d7aabcb912 assets/create/lang/unfinished/nl_nl.json
1864077ccca4c023e5bee33a3b1efe9ccdcaad28 assets/create/lang/unfinished/pt_br.json
1559765f5d8f1361e1a78680c60dd16ac5111259 assets/create/lang/unfinished/ru_ru.json
7b9680e0d83fdd4749418e54342fa567b4e2ea6b assets/create/lang/unfinished/zh_cn.json
ea077d3e3141001ebe3fb2cda60276ac21647a1f assets/create/lang/unfinished/zh_tw.json
846200eb548d3bfa2e77b41039de159b4b6cfb45 assets/create/models/block/acacia_window.json
1930fa3a3c98d53dd19e4ee7f55bc27fd47aa281 assets/create/models/block/acacia_window_pane_noside.json
1763ea2c9b981d187f5031ba608f3d5d3be3986a assets/create/models/block/acacia_window_pane_noside_alt.json

View file

@ -1804,15 +1804,19 @@
"_": "->------------------------] MetaDoc Text [------------------------<-",
"create.ponder.hold_to_ponder": "Hold [%1$s] to Ponder",
"create.ponder.subject": "Subject of this scene",
"create.ponder.pondering": "Pondering about...",
"create.ponder.identify_mode": "Identify mode active.\nUnpause with [%1$s]",
"create.ponder.shared.sneak_and": "Sneak +",
"create.ponder.shared.ctrl_and": "Ctrl +",
"create.ponder.brass_funnel.scene_0.funnels_transfer": "Funnels are ideal for transferring items from and to inventories.",
"create.ponder.brass_funnel.scene_0.title": "Using funnels",
"create.ponder.brass_funnel.scene_1.regular_place": "Placed normally, it pull items from the inventory.",
"create.ponder.brass_funnel.scene_1.same_for_other": "Same rules will apply for most orientations.",
"create.ponder.brass_funnel.scene_1.wrench_reverse": "Using a wrench, the funnel can be flipped after placement.",
"create.ponder.brass_funnel.scene_1.belt_funnel": "Funnels in line with a belt will adjust their direction based it.",
"create.ponder.brass_funnel.scene_1.belt_funnel": "Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.brass_funnel.scene_1.title": "Direction of Transfer",
"create.ponder.brass_funnel.scene_1.sneak_place": "Placed while sneaking, it will put items into the inventory.",
"create.ponder.brass_funnel.scene_2.title": "Funnel compatibility",
"create.ponder.shaft.scene_0.shaft_relay": "Shafts will relay rotation in a straight line.",
"create.ponder.shaft.scene_0.title": "Relaying rotational force using Shafts",
@ -1845,10 +1849,12 @@
"create.ponder.brass_hand.scene_8.title": "Manipulating Items",
"create.ponder.andesite_funnel.scene_0.funnels_transfer": "Funnels are ideal for transferring items from and to inventories.",
"create.ponder.andesite_funnel.scene_0.title": "Using funnels",
"create.ponder.andesite_funnel.scene_1.regular_place": "Placed normally, it pull items from the inventory.",
"create.ponder.andesite_funnel.scene_1.same_for_other": "Same rules will apply for most orientations.",
"create.ponder.andesite_funnel.scene_1.wrench_reverse": "Using a wrench, the funnel can be flipped after placement.",
"create.ponder.andesite_funnel.scene_1.belt_funnel": "Funnels in line with a belt will adjust their direction based it.",
"create.ponder.andesite_funnel.scene_1.belt_funnel": "Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.andesite_funnel.scene_1.title": "Direction of Transfer",
"create.ponder.andesite_funnel.scene_1.sneak_place": "Placed while sneaking, it will put items into the inventory.",
"create.ponder.andesite_funnel.scene_2.title": "Funnel compatibility",
"_": "Thank you for translating Create!"

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1017",
"_": "Missing Localizations: 1023",
"_": "->------------------------] Game Elements [------------------------<-",
@ -1805,15 +1805,19 @@
"_": "->------------------------] MetaDoc Text [------------------------<-",
"create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder",
"create.ponder.subject": "UNLOCALIZED: Subject of this scene",
"create.ponder.pondering": "UNLOCALIZED: Pondering about...",
"create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]",
"create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +",
"create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +",
"create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.",
"create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels",
"create.ponder.brass_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.",
"create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.",
"create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.",
"create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.",
"create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer",
"create.ponder.brass_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.",
"create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility",
"create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.",
"create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts",
@ -1846,10 +1850,12 @@
"create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items",
"create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.",
"create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels",
"create.ponder.andesite_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.",
"create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.",
"create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.",
"create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.",
"create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer",
"create.ponder.andesite_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.",
"create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility",
"_": "Thank you for translating Create!"

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 59",
"_": "Missing Localizations: 65",
"_": "->------------------------] Game Elements [------------------------<-",
@ -1805,15 +1805,19 @@
"_": "->------------------------] MetaDoc Text [------------------------<-",
"create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder",
"create.ponder.subject": "UNLOCALIZED: Subject of this scene",
"create.ponder.pondering": "UNLOCALIZED: Pondering about...",
"create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]",
"create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +",
"create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +",
"create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.",
"create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels",
"create.ponder.brass_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.",
"create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.",
"create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.",
"create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.",
"create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer",
"create.ponder.brass_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.",
"create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility",
"create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.",
"create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts",
@ -1846,10 +1850,12 @@
"create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items",
"create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.",
"create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels",
"create.ponder.andesite_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.",
"create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.",
"create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.",
"create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.",
"create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer",
"create.ponder.andesite_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.",
"create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility",
"_": "Thank you for translating Create!"

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 947",
"_": "Missing Localizations: 953",
"_": "->------------------------] Game Elements [------------------------<-",
@ -1805,15 +1805,19 @@
"_": "->------------------------] MetaDoc Text [------------------------<-",
"create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder",
"create.ponder.subject": "UNLOCALIZED: Subject of this scene",
"create.ponder.pondering": "UNLOCALIZED: Pondering about...",
"create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]",
"create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +",
"create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +",
"create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.",
"create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels",
"create.ponder.brass_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.",
"create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.",
"create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.",
"create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.",
"create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer",
"create.ponder.brass_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.",
"create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility",
"create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.",
"create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts",
@ -1846,10 +1850,12 @@
"create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items",
"create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.",
"create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels",
"create.ponder.andesite_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.",
"create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.",
"create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.",
"create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.",
"create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer",
"create.ponder.andesite_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.",
"create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility",
"_": "Thank you for translating Create!"

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 729",
"_": "Missing Localizations: 735",
"_": "->------------------------] Game Elements [------------------------<-",
@ -1805,15 +1805,19 @@
"_": "->------------------------] MetaDoc Text [------------------------<-",
"create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder",
"create.ponder.subject": "UNLOCALIZED: Subject of this scene",
"create.ponder.pondering": "UNLOCALIZED: Pondering about...",
"create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]",
"create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +",
"create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +",
"create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.",
"create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels",
"create.ponder.brass_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.",
"create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.",
"create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.",
"create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.",
"create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer",
"create.ponder.brass_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.",
"create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility",
"create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.",
"create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts",
@ -1846,10 +1850,12 @@
"create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items",
"create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.",
"create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels",
"create.ponder.andesite_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.",
"create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.",
"create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.",
"create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.",
"create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer",
"create.ponder.andesite_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.",
"create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility",
"_": "Thank you for translating Create!"

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 64",
"_": "Missing Localizations: 70",
"_": "->------------------------] Game Elements [------------------------<-",
@ -1805,15 +1805,19 @@
"_": "->------------------------] MetaDoc Text [------------------------<-",
"create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder",
"create.ponder.subject": "UNLOCALIZED: Subject of this scene",
"create.ponder.pondering": "UNLOCALIZED: Pondering about...",
"create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]",
"create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +",
"create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +",
"create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.",
"create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels",
"create.ponder.brass_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.",
"create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.",
"create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.",
"create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.",
"create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer",
"create.ponder.brass_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.",
"create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility",
"create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.",
"create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts",
@ -1846,10 +1850,12 @@
"create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items",
"create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.",
"create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels",
"create.ponder.andesite_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.",
"create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.",
"create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.",
"create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.",
"create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer",
"create.ponder.andesite_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.",
"create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility",
"_": "Thank you for translating Create!"

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 71",
"_": "Missing Localizations: 77",
"_": "->------------------------] Game Elements [------------------------<-",
@ -1805,15 +1805,19 @@
"_": "->------------------------] MetaDoc Text [------------------------<-",
"create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder",
"create.ponder.subject": "UNLOCALIZED: Subject of this scene",
"create.ponder.pondering": "UNLOCALIZED: Pondering about...",
"create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]",
"create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +",
"create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +",
"create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.",
"create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels",
"create.ponder.brass_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.",
"create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.",
"create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.",
"create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.",
"create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer",
"create.ponder.brass_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.",
"create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility",
"create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.",
"create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts",
@ -1846,10 +1850,12 @@
"create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items",
"create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.",
"create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels",
"create.ponder.andesite_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.",
"create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.",
"create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.",
"create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.",
"create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer",
"create.ponder.andesite_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.",
"create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility",
"_": "Thank you for translating Create!"

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 118",
"_": "Missing Localizations: 124",
"_": "->------------------------] Game Elements [------------------------<-",
@ -1805,15 +1805,19 @@
"_": "->------------------------] MetaDoc Text [------------------------<-",
"create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder",
"create.ponder.subject": "UNLOCALIZED: Subject of this scene",
"create.ponder.pondering": "UNLOCALIZED: Pondering about...",
"create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]",
"create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +",
"create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +",
"create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.",
"create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels",
"create.ponder.brass_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.",
"create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.",
"create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.",
"create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.",
"create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer",
"create.ponder.brass_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.",
"create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility",
"create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.",
"create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts",
@ -1846,10 +1850,12 @@
"create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items",
"create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.",
"create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels",
"create.ponder.andesite_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.",
"create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.",
"create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.",
"create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.",
"create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer",
"create.ponder.andesite_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.",
"create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility",
"_": "Thank you for translating Create!"

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1216",
"_": "Missing Localizations: 1222",
"_": "->------------------------] Game Elements [------------------------<-",
@ -1805,15 +1805,19 @@
"_": "->------------------------] MetaDoc Text [------------------------<-",
"create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder",
"create.ponder.subject": "UNLOCALIZED: Subject of this scene",
"create.ponder.pondering": "UNLOCALIZED: Pondering about...",
"create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]",
"create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +",
"create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +",
"create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.",
"create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels",
"create.ponder.brass_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.",
"create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.",
"create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.",
"create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.",
"create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer",
"create.ponder.brass_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.",
"create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility",
"create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.",
"create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts",
@ -1846,10 +1850,12 @@
"create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items",
"create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.",
"create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels",
"create.ponder.andesite_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.",
"create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.",
"create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.",
"create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.",
"create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer",
"create.ponder.andesite_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.",
"create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility",
"_": "Thank you for translating Create!"

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 1282",
"_": "Missing Localizations: 1288",
"_": "->------------------------] Game Elements [------------------------<-",
@ -1805,15 +1805,19 @@
"_": "->------------------------] MetaDoc Text [------------------------<-",
"create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder",
"create.ponder.subject": "UNLOCALIZED: Subject of this scene",
"create.ponder.pondering": "UNLOCALIZED: Pondering about...",
"create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]",
"create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +",
"create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +",
"create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.",
"create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels",
"create.ponder.brass_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.",
"create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.",
"create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.",
"create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.",
"create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer",
"create.ponder.brass_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.",
"create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility",
"create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.",
"create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts",
@ -1846,10 +1850,12 @@
"create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items",
"create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.",
"create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels",
"create.ponder.andesite_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.",
"create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.",
"create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.",
"create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.",
"create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer",
"create.ponder.andesite_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.",
"create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility",
"_": "Thank you for translating Create!"

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 68",
"_": "Missing Localizations: 74",
"_": "->------------------------] Game Elements [------------------------<-",
@ -1805,15 +1805,19 @@
"_": "->------------------------] MetaDoc Text [------------------------<-",
"create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder",
"create.ponder.subject": "UNLOCALIZED: Subject of this scene",
"create.ponder.pondering": "UNLOCALIZED: Pondering about...",
"create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]",
"create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +",
"create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +",
"create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.",
"create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels",
"create.ponder.brass_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.",
"create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.",
"create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.",
"create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.",
"create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer",
"create.ponder.brass_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.",
"create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility",
"create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.",
"create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts",
@ -1846,10 +1850,12 @@
"create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items",
"create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.",
"create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels",
"create.ponder.andesite_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.",
"create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.",
"create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.",
"create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.",
"create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer",
"create.ponder.andesite_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.",
"create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility",
"_": "Thank you for translating Create!"

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 66",
"_": "Missing Localizations: 72",
"_": "->------------------------] Game Elements [------------------------<-",
@ -1805,15 +1805,19 @@
"_": "->------------------------] MetaDoc Text [------------------------<-",
"create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder",
"create.ponder.subject": "UNLOCALIZED: Subject of this scene",
"create.ponder.pondering": "UNLOCALIZED: Pondering about...",
"create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]",
"create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +",
"create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +",
"create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.",
"create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels",
"create.ponder.brass_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.",
"create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.",
"create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.",
"create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.",
"create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer",
"create.ponder.brass_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.",
"create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility",
"create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.",
"create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts",
@ -1846,10 +1850,12 @@
"create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items",
"create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.",
"create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels",
"create.ponder.andesite_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.",
"create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.",
"create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.",
"create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.",
"create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer",
"create.ponder.andesite_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.",
"create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility",
"_": "Thank you for translating Create!"

View file

@ -1,5 +1,5 @@
{
"_": "Missing Localizations: 71",
"_": "Missing Localizations: 77",
"_": "->------------------------] Game Elements [------------------------<-",
@ -1805,15 +1805,19 @@
"_": "->------------------------] MetaDoc Text [------------------------<-",
"create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder",
"create.ponder.subject": "UNLOCALIZED: Subject of this scene",
"create.ponder.pondering": "UNLOCALIZED: Pondering about...",
"create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]",
"create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +",
"create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +",
"create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.",
"create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels",
"create.ponder.brass_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.",
"create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.",
"create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.",
"create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.",
"create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer",
"create.ponder.brass_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.",
"create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility",
"create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.",
"create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts",
@ -1846,10 +1850,12 @@
"create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items",
"create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.",
"create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels",
"create.ponder.andesite_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.",
"create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.",
"create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.",
"create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.",
"create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.",
"create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer",
"create.ponder.andesite_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.",
"create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility",
"_": "Thank you for translating Create!"

View file

@ -67,7 +67,7 @@ public class DeployTool extends PlacementToolBase {
.translateBack(origin);
AABBOutline outline = schematicHandler.getOutline();
outline.render(ms, buffer);
outline.render(ms, buffer, pt);
outline.getParams()
.clearTextures();
ms.pop();

View file

@ -3,6 +3,7 @@ package com.simibubi.create.content.schematics.client.tools;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.AllSpecialTextures;
import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer;
import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.simibubi.create.foundation.utility.outliner.AABBOutline;
import net.minecraft.util.Direction;
@ -74,7 +75,7 @@ public class FlipTool extends PlacementToolBase {
.disableNormals()
.colored(0xdddddd)
.withFaceTextures(tex, tex);
outline.render(ms, buffer);
outline.render(ms, buffer, AnimationTickHolder.getPartialTicks());
super.renderOnSchematic(ms, buffer);
}

View file

@ -2,6 +2,7 @@ package com.simibubi.create.content.schematics.client.tools;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer;
import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.simibubi.create.foundation.utility.outliner.LineOutline;
import net.minecraft.util.math.AxisAlignedBB;
@ -35,7 +36,7 @@ public class RotateTool extends PlacementToolBase {
.colored(0xdddddd)
.lineWidth(1 / 16f);
line.set(start, end)
.render(ms, buffer);
.render(ms, buffer, AnimationTickHolder.getPartialTicks());
super.renderOnSchematic(ms, buffer);
}

View file

@ -143,7 +143,7 @@ public abstract class SchematicToolBase implements ISchematicTool {
.colored(0x6886c5)
.withFaceTexture(AllSpecialTextures.CHECKERED)
.lineWidth(1 / 16f);
outline.render(ms, buffer);
outline.render(ms, buffer, AnimationTickHolder.getPartialTicks());
outline.getParams()
.clearTextures();
ms.pop();

View file

@ -139,6 +139,7 @@ public class ClientEvents {
@SubscribeEvent
public static void onRenderWorld(RenderWorldLastEvent event) {
Vec3d cameraPos = Minecraft.getInstance().gameRenderer.getActiveRenderInfo().getProjectedView();
float pt = AnimationTickHolder.getPartialTicks();
MatrixStack ms = event.getMatrixStack();
ms.push();
@ -149,9 +150,8 @@ public class ClientEvents {
CreateClient.schematicHandler.render(ms, buffer);
CreateClient.ghostBlocks.renderAll(ms, buffer);
CreateClient.outliner.renderOutlines(ms, buffer);
CreateClient.outliner.renderOutlines(ms, buffer, pt);
// LightVolumeDebugger.render(ms, buffer);
// CollisionDebugger.render(ms, buffer);
buffer.draw();
RenderSystem.enableCull();

View file

@ -1,114 +0,0 @@
package com.simibubi.create.foundation.collision;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.AllSpecialTextures;
import com.simibubi.create.CreateClient;
import com.simibubi.create.foundation.collision.ContinuousOBBCollider.ContinuousSeparationManifold;
import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer;
import com.simibubi.create.foundation.utility.AngleHelper;
import com.simibubi.create.foundation.utility.MatrixStacker;
import com.simibubi.create.foundation.utility.outliner.AABBOutline;
import net.minecraft.client.Minecraft;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.util.math.RayTraceResult;
import net.minecraft.util.math.RayTraceResult.Type;
import net.minecraft.util.math.Vec3d;
public class CollisionDebugger {
public static AxisAlignedBB AABB = new AxisAlignedBB(BlockPos.ZERO.up(10));
public static OrientedBB OBB = new OrientedBB(new AxisAlignedBB(BlockPos.ZERO));
public static Vec3d motion = Vec3d.ZERO;
static ContinuousSeparationManifold seperation;
static double angle = 0;
static AABBOutline outline;
public static void onScroll(double delta) {
angle += delta;
angle = (int) angle;
OBB.setRotation(new Matrix3d().asZRotation(AngleHelper.rad(angle)));
}
public static void render(MatrixStack ms, SuperRenderTypeBuffer buffer) {
ms.push();
outline = new AABBOutline(OBB.getAsAxisAlignedBB());
outline.getParams()
.withFaceTexture(seperation == null ? AllSpecialTextures.CHECKERED : null)
.colored(0xffffff);
if (seperation != null)
outline.getParams()
.lineWidth(1 / 64f)
.colored(0xff6544);
MatrixStacker.of(ms)
.translate(OBB.center);
ms.peek()
.getModel()
.multiply(OBB.rotation.getAsMatrix4f());
MatrixStacker.of(ms)
.translateBack(OBB.center);
outline.render(ms, buffer);
ms.pop();
// ms.push();
// if (motion.length() != 0 && (seperation == null || seperation.getTimeOfImpact() != 1)) {
// outline.getParams()
// .colored(0x6544ff)
// .lineWidth(1 / 32f);
// MatrixStacker.of(ms)
// .translate(seperation != null ? seperation.getAllowedMotion(motion) : motion)
// .translate(OBB.center);
// ms.peek()
// .getModel()
// .multiply(OBB.rotation.getAsMatrix4f());
// MatrixStacker.of(ms)
// .translateBack(OBB.center);
// outline.render(ms, buffer);
// }
// ms.pop();
ms.push();
if (seperation != null) {
Vec3d asSeparationVec = seperation.asSeparationVec(.5f);
if (asSeparationVec != null) {
outline.getParams()
.colored(0x65ff44)
.lineWidth(1 / 32f);
MatrixStacker.of(ms)
.translate(asSeparationVec)
.translate(OBB.center);
ms.peek()
.getModel()
.multiply(OBB.rotation.getAsMatrix4f());
MatrixStacker.of(ms)
.translateBack(OBB.center);
outline.render(ms, buffer);
}
}
ms.pop();
}
public static void tick() {
AABB = new AxisAlignedBB(BlockPos.ZERO.up(60)).offset(.5, 0, .5);
motion = Vec3d.ZERO;
RayTraceResult mouse = Minecraft.getInstance().objectMouseOver;
if (mouse != null && mouse.getType() == Type.BLOCK) {
BlockRayTraceResult hit = (BlockRayTraceResult) mouse;
OBB.setCenter(hit.getHitVec());
seperation = OBB.intersect(AABB, motion);
}
CreateClient.outliner.showAABB(AABB, AABB)
.withFaceTexture(seperation == null ? AllSpecialTextures.CHECKERED : null);
}
static void showDebugLine(Vec3d relativeStart, Vec3d relativeEnd, int color, String id, int offset) {
Vec3d center = CollisionDebugger.AABB.getCenter()
.add(0, 1 + offset / 16f, 0);
CreateClient.outliner.showLine(id + OBBCollider.checkCount, center.add(relativeStart), center.add(relativeEnd))
.colored(color)
.lineWidth(1 / 32f);
}
}

View file

@ -1,6 +1,5 @@
package com.simibubi.create.foundation.collision;
import static com.simibubi.create.foundation.collision.CollisionDebugger.showDebugLine;
import static java.lang.Math.abs;
import static java.lang.Math.signum;
@ -60,7 +59,6 @@ public class OBBCollider {
if (diff > 0)
return true;
// boolean isBestSeperation = distance != 0 && -(diff) <= abs(bestSeparation.getValue());
boolean isBestSeperation = checkCount == 2; // Debug specific separations
if (isBestSeperation) {
@ -68,17 +66,6 @@ public class OBBCollider {
double value = sTL * abs(diff);
mf.axis = axis.normalize();
mf.separation = value;
// Visualize values
if (CollisionDebugger.AABB != null) {
Vec3d normalizedAxis = axis.normalize();
showDebugLine(Vec3d.ZERO, normalizedAxis.scale(TL), 0xbb00bb, "tl", 4);
showDebugLine(Vec3d.ZERO, normalizedAxis.scale(sTL * rA), 0xff4444, "ra", 3);
showDebugLine(normalizedAxis.scale(sTL * (distance - rB)), normalizedAxis.scale(TL), 0x4444ff, "rb", 2);
showDebugLine(normalizedAxis.scale(sTL * (distance - rB)),
normalizedAxis.scale(sTL * (distance - rB) + value), 0xff9966, "separation", 1);
System.out.println("TL:" + TL + ", rA: " + rA + ", rB: " + rB);
}
}
return false;

View file

@ -52,7 +52,9 @@ public class PonderLocalization {
JsonObject object = new JsonObject();
addGeneral(object, PonderTooltipHandler.HOLD_TO_PONDER, "Hold [%1$s] to Ponder");
addGeneral(object, PonderTooltipHandler.SUBJECT, "Subject of this scene");
addGeneral(object, PonderUI.PONDERING, "Pondering about...");
addGeneral(object, PonderUI.IDENTIFY_MODE, "Identify mode active.\nUnpause with [%1$s]");
shared.forEach((k, v) -> object.addProperty(Create.ID + "." + langKeyForShared(k), v));
specific.forEach((rl, map) -> {

View file

@ -12,7 +12,11 @@ import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;
import org.apache.commons.lang3.mutable.MutableDouble;
import org.apache.commons.lang3.mutable.MutableObject;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.foundation.ponder.content.PonderIndex;
import com.simibubi.create.foundation.ponder.elements.PonderOverlayElement;
import com.simibubi.create.foundation.ponder.elements.PonderSceneElement;
import com.simibubi.create.foundation.ponder.elements.WorldSectionElement;
@ -21,20 +25,27 @@ import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer;
import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.simibubi.create.foundation.utility.LerpedFloat;
import com.simibubi.create.foundation.utility.MatrixStacker;
import com.simibubi.create.foundation.utility.Pair;
import com.simibubi.create.foundation.utility.VecHelper;
import com.simibubi.create.foundation.utility.outliner.Outliner;
import net.minecraft.block.BlockState;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.ActiveRenderInfo;
import net.minecraft.client.renderer.Matrix4f;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.Vector4f;
import net.minecraft.entity.Entity;
import net.minecraft.util.ResourceLocation;
import net.minecraft.item.ItemStack;
import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.util.math.MutableBoundingBox;
import net.minecraft.util.math.Vec2f;
import net.minecraft.util.math.Vec3d;
import net.minecraft.util.math.Vec3i;
public class PonderScene {
@ -84,6 +95,59 @@ public class PonderScene {
setPointOfInterest(new Vec3d(0, 4, 0));
}
public void deselect() {
forEach(WorldSectionElement.class, WorldSectionElement::resetSelectedBlock);
}
public Pair<ItemStack, BlockPos> rayTraceScene(Vec3d from, Vec3d to) {
MutableObject<Pair<WorldSectionElement, BlockPos>> nearestHit = new MutableObject<>();
MutableDouble bestDistance = new MutableDouble(0);
forEach(WorldSectionElement.class, wse -> {
wse.resetSelectedBlock();
if (!wse.isVisible())
return;
Pair<Vec3d, BlockPos> rayTrace = wse.rayTrace(world, from, to);
if (rayTrace == null)
return;
double distanceTo = rayTrace.getFirst()
.distanceTo(from);
if (nearestHit.getValue() != null && distanceTo >= bestDistance.getValue())
return;
nearestHit.setValue(Pair.of(wse, rayTrace.getSecond()));
bestDistance.setValue(distanceTo);
});
if (nearestHit.getValue() == null)
return Pair.of(ItemStack.EMPTY, null);
BlockPos selectedPos = nearestHit.getValue()
.getSecond();
BlockPos origin = new BlockPos(offsetX, 0, offsetZ);
if (!world.getBounds()
.isVecInside(selectedPos))
return Pair.of(ItemStack.EMPTY, null);
if (new MutableBoundingBox(origin, origin.add(new Vec3i(size - 1, 0, size - 1))).isVecInside(selectedPos)) {
if (PonderIndex.EDITOR_MODE)
nearestHit.getValue()
.getFirst()
.selectBlock(selectedPos);
return Pair.of(ItemStack.EMPTY, selectedPos);
}
nearestHit.getValue()
.getFirst()
.selectBlock(selectedPos);
BlockState blockState = world.getBlockState(selectedPos);
ItemStack pickBlock = blockState.getPickBlock(
new BlockRayTraceResult(VecHelper.getCenterOf(selectedPos), Direction.UP, selectedPos, true), world,
selectedPos, Minecraft.getInstance().player);
return Pair.of(pickBlock, selectedPos);
}
public String getTitle() {
return getString("title");
}
@ -132,19 +196,16 @@ public class PonderScene {
activeSchedule.add(new HideAllInstruction(10, null));
}
public void renderScene(SuperRenderTypeBuffer buffer, MatrixStack ms) {
float pt = Minecraft.getInstance()
.getRenderPartialTicks();
public void renderScene(SuperRenderTypeBuffer buffer, MatrixStack ms, float pt) {
ms.push();
forEachVisible(PonderSceneElement.class, e -> e.renderFirst(world, buffer, ms));
forEachVisible(PonderSceneElement.class, e -> e.renderFirst(world, buffer, ms, pt));
for (RenderType type : RenderType.getBlockLayers())
forEachVisible(PonderSceneElement.class, e -> e.renderLayer(world, buffer, type, ms));
forEachVisible(PonderSceneElement.class, e -> e.renderLast(world, buffer, ms));
forEachVisible(PonderSceneElement.class, e -> e.renderLayer(world, buffer, type, ms, pt));
forEachVisible(PonderSceneElement.class, e -> e.renderLast(world, buffer, ms, pt));
info.set(transform.xRotation.getValue(pt), transform.yRotation.getValue(pt));
world.renderEntities(ms, buffer, info);
world.renderParticles(ms, buffer, info);
outliner.renderOutlines(ms, buffer);
world.renderEntities(ms, buffer, info, pt);
world.renderParticles(ms, buffer, info, pt);
outliner.renderOutlines(ms, buffer, pt);
ms.pop();
}
@ -295,8 +356,10 @@ public class PonderScene {
}
public MatrixStack apply(MatrixStack ms) {
float pt = Minecraft.getInstance()
.getRenderPartialTicks();
return apply(ms, AnimationTickHolder.getPartialTicks());
}
public MatrixStack apply(MatrixStack ms, float pt) {
ms.translate(width / 2, height / 2, 200);
MatrixStacker.of(ms)
@ -316,12 +379,22 @@ public class PonderScene {
return ms;
}
public Vec3d screenToScene(float x, float y, int depth) {
public Vec3d screenToScene(double x, double y, int depth) {
refreshMatrix();
float pt = AnimationTickHolder.getPartialTicks();
Vec3d vec = new Vec3d(x, y, depth);
// wut
vec = vec.subtract(width / 2, height / 2, 200);
vec = VecHelper.rotate(vec, 35, Axis.X);
vec = VecHelper.rotate(vec, -55, Axis.Y);
vec = vec.subtract(offset, 0, 0);
vec = VecHelper.rotate(vec, 55, Axis.Y);
vec = VecHelper.rotate(vec, -35, Axis.X);
vec = VecHelper.rotate(vec, -xRotation.getValue(pt), Axis.X);
vec = VecHelper.rotate(vec, -yRotation.getValue(pt), Axis.Y);
vec = vec.mul(1f / 30, 1f / -30, 1f / 30);
vec = vec.subtract((size + offsetX) / -2f, -1f, (size + offsetZ) / -2f);
return vec;
}

View file

@ -4,6 +4,7 @@ import java.util.List;
import com.google.common.base.Strings;
import com.simibubi.create.foundation.gui.ScreenOpener;
import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.simibubi.create.foundation.utility.ColorHelper;
import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.foundation.utility.LerpedFloat;
@ -25,29 +26,41 @@ public class PonderTooltipHandler {
static LerpedFloat holdWProgress = LerpedFloat.linear()
.startWithValue(0);
static ItemStack lastHoveredStack = null;
static ItemStack lastHoveredStack = ItemStack.EMPTY;
static boolean subject = false;
public static final String HOLD_TO_PONDER = PonderLocalization.LANG_PREFIX + "hold_to_ponder";
public static final String SUBJECT = PonderLocalization.LANG_PREFIX + "subject";
public static void tick() {
Minecraft instance = Minecraft.getInstance();
Screen currentScreen = instance.currentScreen;
if (!(currentScreen instanceof ContainerScreen))
return;
ContainerScreen<?> cs = (ContainerScreen<?>) currentScreen;
ItemStack stack = ItemStack.EMPTY;
ItemStack prevStack = lastHoveredStack;
lastHoveredStack = null;
Slot slotUnderMouse = cs.getSlotUnderMouse();
if (slotUnderMouse == null || !slotUnderMouse.getHasStack())
lastHoveredStack = ItemStack.EMPTY;
subject = false;
if (currentScreen instanceof ContainerScreen) {
ContainerScreen<?> cs = (ContainerScreen<?>) currentScreen;
Slot slotUnderMouse = cs.getSlotUnderMouse();
if (slotUnderMouse == null || !slotUnderMouse.getHasStack())
return;
stack = slotUnderMouse.getStack();
} else if (currentScreen instanceof PonderUI) {
PonderUI ponderUI = (PonderUI) currentScreen;
stack = ponderUI.getHoveredTooltipItem();
if (stack.isItemEqual(ponderUI.getSubject()))
subject = true;
} else
return;
ItemStack stack = slotUnderMouse.getStack();
if (stack.isEmpty())
return;
if (!PonderRegistry.all.containsKey(stack.getItem()
.getRegistryName()))
return;
if (prevStack != stack)
if (prevStack.isEmpty() || !prevStack.isItemEqual(stack))
holdWProgress.startWithValue(0);
float value = holdWProgress.getValue();
@ -56,10 +69,13 @@ public class PonderTooltipHandler {
long window = instance.getWindow()
.getHandle();
if (InputMappings.isKeyDown(window, keyCode)) {
if (value >= 1)
if (!subject && InputMappings.isKeyDown(window, keyCode)) {
if (value >= 1) {
ScreenOpener.open(new PonderUI(PonderRegistry.compile(stack.getItem()
.getRegistryName())));
holdWProgress.startWithValue(0);
return;
}
holdWProgress.setValue(Math.min(1, value + Math.max(.25f, value) * .25f));
} else
holdWProgress.setValue(Math.max(0, value - .05f));
@ -68,10 +84,14 @@ public class PonderTooltipHandler {
}
public static void addToTooltip(List<ITextComponent> toolTip, ItemStack stack) {
float renderPartialTicks = AnimationTickHolder.getPartialTicks();
if (lastHoveredStack != stack)
return;
float renderPartialTicks = Minecraft.getInstance()
.getRenderPartialTicks();
if (subject) {
toolTip.set(1, Lang.createTranslationTextComponent(SUBJECT)
.applyTextStyle(TextFormatting.GREEN));
return;
}
toolTip.set(1, makeProgressBar(Math.min(1, holdWProgress.getValue(renderPartialTicks) * 8 / 7f)));
}

View file

@ -9,41 +9,58 @@ import com.mojang.blaze3d.systems.RenderSystem;
import com.simibubi.create.foundation.gui.AbstractSimiScreen;
import com.simibubi.create.foundation.gui.AllGuiTextures;
import com.simibubi.create.foundation.gui.AllIcons;
import com.simibubi.create.foundation.ponder.PonderScene.SceneTransform;
import com.simibubi.create.foundation.ponder.content.PonderIndex;
import com.simibubi.create.foundation.ponder.ui.PonderButton;
import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer;
import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.simibubi.create.foundation.utility.ColorHelper;
import com.simibubi.create.foundation.utility.Iterate;
import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.foundation.utility.LerpedFloat;
import com.simibubi.create.foundation.utility.LerpedFloat.Chaser;
import com.simibubi.create.foundation.utility.Pair;
import com.simibubi.create.foundation.utility.Pointing;
import net.minecraft.client.ClipboardHelper;
import net.minecraft.client.GameSettings;
import net.minecraft.client.MainWindow;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.settings.KeyBinding;
import net.minecraft.item.ItemStack;
import net.minecraft.util.Direction;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.MutableBoundingBox;
import net.minecraft.util.math.Vec3d;
import net.minecraft.util.text.StringTextComponent;
import net.minecraft.util.text.TextFormatting;
import net.minecraftforge.fml.client.gui.GuiUtils;
import net.minecraftforge.registries.ForgeRegistries;
public class PonderUI extends AbstractSimiScreen {
public static final String PONDERING = PonderLocalization.LANG_PREFIX + "pondering";
public static final String IDENTIFY_MODE = PonderLocalization.LANG_PREFIX + "identify_mode";
private List<PonderScene> scenes;
private LerpedFloat fadeIn;
private LerpedFloat sceneProgress;
ItemStack stack;
private boolean identifyMode;
private ItemStack hoveredTooltipItem;
private BlockPos hoveredBlockPos;
private ClipboardHelper clipboardHelper;
private BlockPos copiedBlockPos;
private LerpedFloat lazyIndex;
private int index = 0;
private PonderButton left, right, icon, refresh, scan;
private PonderButton left, right, icon, scan;
public PonderUI(List<PonderScene> scenes) {
this.scenes = scenes;
@ -54,6 +71,7 @@ public class PonderUI extends AbstractSimiScreen {
fadeIn = LerpedFloat.linear()
.startWithValue(0)
.chase(1, .1f, Chaser.EXP);
clipboardHelper = new ClipboardHelper();
}
@Override
@ -76,7 +94,12 @@ public class PonderUI extends AbstractSimiScreen {
int spacing = 8;
int bX = (width - 20) / 2 - (70 + 2 * spacing);
widgets.add(scan = new PonderButton(bX, bY, () -> identifyMode = !identifyMode).showing(AllIcons.I_MTD_SCAN)
widgets.add(scan = new PonderButton(bX, bY, () -> {
identifyMode = !identifyMode;
if (!identifyMode)
scenes.get(index)
.deselect();
}).showing(AllIcons.I_MTD_SCAN)
.shortcut(bindings.keyBindDrop)
.fade(0, -1));
@ -96,7 +119,7 @@ public class PonderUI extends AbstractSimiScreen {
.fade(0, -1));
bX += 50 + spacing;
widgets.add(refresh = new PonderButton(bX, bY, this::replay).showing(AllIcons.I_MTD_REPLAY)
widgets.add(new PonderButton(bX, bY, this::replay).showing(AllIcons.I_MTD_REPLAY)
.shortcut(bindings.keyBindBack)
.fade(0, -1));
@ -105,17 +128,38 @@ public class PonderUI extends AbstractSimiScreen {
@Override
public void tick() {
PonderScene activeScene = scenes.get(index);
activeScene.tick();
if (!identifyMode)
activeScene.tick();
sceneProgress.chase(activeScene.getSceneProgress(), .5f, Chaser.EXP);
lazyIndex.tickChaser();
fadeIn.tickChaser();
sceneProgress.tickChaser();
float lazyIndexValue = lazyIndex.getValue();
if (Math.abs(lazyIndexValue - index) > 1 / 512f)
scenes.get(lazyIndexValue < index ? index - 1 : index + 1)
.tick();
if (!identifyMode) {
float lazyIndexValue = lazyIndex.getValue();
if (Math.abs(lazyIndexValue - index) > 1 / 512f)
scenes.get(lazyIndexValue < index ? index - 1 : index + 1)
.tick();
}
updateIdentifiedItem(activeScene);
}
public void updateIdentifiedItem(PonderScene activeScene) {
hoveredTooltipItem = ItemStack.EMPTY;
hoveredBlockPos = null;
if (!identifyMode)
return;
MainWindow w = minecraft.getWindow();
double mouseX = minecraft.mouseHelper.getMouseX() * w.getScaledWidth() / w.getWidth();
double mouseY = minecraft.mouseHelper.getMouseY() * w.getScaledHeight() / w.getHeight();
SceneTransform t = activeScene.getTransform();
Vec3d vec1 = t.screenToScene(mouseX, mouseY, 1000);
Vec3d vec2 = t.screenToScene(mouseX, mouseY, -100);
Pair<ItemStack, BlockPos> pair = activeScene.rayTraceScene(vec1, vec2);
hoveredTooltipItem = pair.getFirst();
hoveredBlockPos = pair.getSecond();
}
@Override
@ -126,6 +170,7 @@ public class PonderUI extends AbstractSimiScreen {
}
protected void replay() {
identifyMode = false;
scenes.get(index)
.begin();
}
@ -140,6 +185,7 @@ public class PonderUI extends AbstractSimiScreen {
scenes.get(index)
.begin();
lazyIndex.chase(index, 1 / 4f, Chaser.EXP);
identifyMode = false;
return true;
} else
index = prevIndex;
@ -149,8 +195,8 @@ public class PonderUI extends AbstractSimiScreen {
@Override
protected void renderWindow(int mouseX, int mouseY, float partialTicks) {
RenderSystem.enableBlend();
renderVisibleScenes(mouseX, mouseY, partialTicks);
renderWidgets(mouseX, mouseY, partialTicks);
renderVisibleScenes(mouseX, mouseY, identifyMode ? 0 : partialTicks);
renderWidgets(mouseX, mouseY, identifyMode ? 0 : partialTicks);
}
protected void renderVisibleScenes(int mouseX, int mouseY, float partialTicks) {
@ -164,7 +210,7 @@ public class PonderUI extends AbstractSimiScreen {
SuperRenderTypeBuffer buffer = SuperRenderTypeBuffer.getInstance();
PonderScene story = scenes.get(i);
MatrixStack ms = new MatrixStack();
double value = lazyIndex.getValue(partialTicks);
double value = lazyIndex.getValue(AnimationTickHolder.getPartialTicks());
double diff = i - value;
double slide = MathHelper.lerp(diff * diff, 200, 600) * diff;
@ -174,8 +220,8 @@ public class PonderUI extends AbstractSimiScreen {
ms.push();
story.transform.updateScreenParams(width, height, slide);
story.transform.apply(ms);
story.renderScene(buffer, ms);
story.transform.apply(ms, partialTicks);
story.renderScene(buffer, ms, partialTicks);
buffer.draw();
// coords for debug
@ -238,6 +284,7 @@ public class PonderUI extends AbstractSimiScreen {
float fade = fadeIn.getValue(partialTicks);
float lazyIndexValue = lazyIndex.getValue(partialTicks);
float indexDiff = Math.abs(lazyIndexValue - index);
PonderScene activeScene = scenes.get(index);
int textColor = 0xeeeeee;
{
@ -250,16 +297,35 @@ public class PonderUI extends AbstractSimiScreen {
y += 12;
x += 0;
RenderSystem.translated(0, 3 * (indexDiff), 0);
font.drawSplitString(scenes.get(index)
.getTitle(), x, y, left.x - x, ColorHelper.applyAlpha(textColor, 1 - indexDiff));
font.drawSplitString(activeScene.getTitle(), x, y, left.x - x,
ColorHelper.applyAlpha(textColor, 1 - indexDiff));
RenderSystem.popMatrix();
}
if (identifyMode) {
RenderSystem.pushMatrix();
RenderSystem.translated(mouseX, mouseY, 800);
drawString(font, "?", 6, 2, 0xddffffff);
RenderSystem.translated(mouseX, mouseY, 100);
if (hoveredTooltipItem.isEmpty()) {
String tooltip = Lang
.createTranslationTextComponent(IDENTIFY_MODE,
new StringTextComponent(minecraft.gameSettings.keyBindDrop.getKeyBinding()
.getLocalizedName()).applyTextStyle(TextFormatting.WHITE))
.applyTextStyle(TextFormatting.GRAY)
.getFormattedText();
renderTooltip(font.listFormattedStringToWidth(tooltip, width / 3), 0, 0);
} else
renderTooltip(hoveredTooltipItem, 0, 0);
if (hoveredBlockPos != null && PonderIndex.EDITOR_MODE) {
RenderSystem.translated(0, -15, 0);
boolean copied = copiedBlockPos != null && hoveredBlockPos.equals(copiedBlockPos);
String coords = new StringTextComponent(
hoveredBlockPos.getX() + ", " + hoveredBlockPos.getY() + ", " + hoveredBlockPos.getZ())
.applyTextStyles(copied ? TextFormatting.GREEN : TextFormatting.GOLD)
.getFormattedText();
renderTooltip(coords, 0, 0);
}
RenderSystem.popMatrix();
scan.flash();
} else {
scan.dim();
@ -288,8 +354,7 @@ public class PonderUI extends AbstractSimiScreen {
if (index == scenes.size() - 1 || index == scenes.size() - 2 && lazyIndexValue > index)
right.fade(scenes.size() - lazyIndexValue - 1);
boolean finished = scenes.get(index)
.isFinished();
boolean finished = activeScene.isFinished();
if (finished)
right.flash();
else
@ -325,6 +390,8 @@ public class PonderUI extends AbstractSimiScreen {
}
private void renderOverlay(int i, float partialTicks) {
if (identifyMode)
return;
RenderSystem.pushMatrix();
PonderScene story = scenes.get(i);
MatrixStack ms = new MatrixStack();
@ -351,6 +418,15 @@ public class PonderUI extends AbstractSimiScreen {
if (handled.booleanValue())
return true;
if (identifyMode && hoveredBlockPos != null && PonderIndex.EDITOR_MODE) {
clipboardHelper.setClipboardString(minecraft.getWindow()
.getHandle(),
"BlockPos copied = util.grid.at(" + hoveredBlockPos.getX() + ", " + hoveredBlockPos.getY() + ", "
+ hoveredBlockPos.getZ() + ");");
copiedBlockPos = hoveredBlockPos;
return true;
}
return super.mouseClicked(x, y, button);
}
@ -383,6 +459,9 @@ public class PonderUI extends AbstractSimiScreen {
if (code == qCode) {
identifyMode = !identifyMode;
if (!identifyMode)
scenes.get(index)
.deselect();
return true;
}
@ -474,17 +553,24 @@ public class PonderUI extends AbstractSimiScreen {
public static void renderBox(int x, int y, int w, int h, int backgroundColor, int borderColorStart,
int borderColorEnd) {
int zLevel = 100;
GuiUtils.drawGradientRect(zLevel, x - 3, y - 4, x + w + 3, y - 3, backgroundColor, backgroundColor);
GuiUtils.drawGradientRect(zLevel, x - 3, y + h + 3, x + w + 3, y + h + 4, backgroundColor, backgroundColor);
GuiUtils.drawGradientRect(zLevel, x - 3, y - 3, x + w + 3, y + h + 3, backgroundColor, backgroundColor);
GuiUtils.drawGradientRect(zLevel, x - 4, y - 3, x - 3, y + h + 3, backgroundColor, backgroundColor);
GuiUtils.drawGradientRect(zLevel, x + w + 3, y - 3, x + w + 4, y + h + 3, backgroundColor, backgroundColor);
GuiUtils.drawGradientRect(zLevel, x - 3, y - 3 + 1, x - 3 + 1, y + h + 3 - 1, borderColorStart, borderColorEnd);
GuiUtils.drawGradientRect(zLevel, x + w + 2, y - 3 + 1, x + w + 3, y + h + 3 - 1, borderColorStart,
borderColorEnd);
GuiUtils.drawGradientRect(zLevel, x - 3, y - 3, x + w + 3, y - 3 + 1, borderColorStart, borderColorStart);
GuiUtils.drawGradientRect(zLevel, x - 3, y + h + 2, x + w + 3, y + h + 3, borderColorEnd, borderColorEnd);
int z = 100;
GuiUtils.drawGradientRect(z, x - 3, y - 4, x + w + 3, y - 3, backgroundColor, backgroundColor);
GuiUtils.drawGradientRect(z, x - 3, y + h + 3, x + w + 3, y + h + 4, backgroundColor, backgroundColor);
GuiUtils.drawGradientRect(z, x - 3, y - 3, x + w + 3, y + h + 3, backgroundColor, backgroundColor);
GuiUtils.drawGradientRect(z, x - 4, y - 3, x - 3, y + h + 3, backgroundColor, backgroundColor);
GuiUtils.drawGradientRect(z, x + w + 3, y - 3, x + w + 4, y + h + 3, backgroundColor, backgroundColor);
GuiUtils.drawGradientRect(z, x - 3, y - 3 + 1, x - 3 + 1, y + h + 3 - 1, borderColorStart, borderColorEnd);
GuiUtils.drawGradientRect(z, x + w + 2, y - 3 + 1, x + w + 3, y + h + 3 - 1, borderColorStart, borderColorEnd);
GuiUtils.drawGradientRect(z, x - 3, y - 3, x + w + 3, y - 3 + 1, borderColorStart, borderColorStart);
GuiUtils.drawGradientRect(z, x - 3, y + h + 2, x + w + 3, y + h + 3, borderColorEnd, borderColorEnd);
}
public ItemStack getHoveredTooltipItem() {
return hoveredTooltipItem;
}
public ItemStack getSubject() {
return stack;
}
}

View file

@ -13,7 +13,6 @@ import com.simibubi.create.content.contraptions.relays.belt.BeltBlock;
import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity;
import com.simibubi.create.content.schematics.SchematicWorld;
import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer;
import com.simibubi.create.foundation.utility.AnimationTickHolder;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
@ -122,9 +121,8 @@ public class PonderWorld extends SchematicWorld {
return this;
}
public void renderEntities(MatrixStack ms, SuperRenderTypeBuffer buffer, ActiveRenderInfo ari) {
public void renderEntities(MatrixStack ms, SuperRenderTypeBuffer buffer, ActiveRenderInfo ari, float pt) {
Vec3d vec3d = ari.getProjectedView();
float pt = AnimationTickHolder.getPartialTicks();
double d0 = vec3d.getX();
double d1 = vec3d.getY();
double d2 = vec3d.getZ();
@ -157,8 +155,8 @@ public class PonderWorld extends SchematicWorld {
renderManager.render(entity, d0 - x, d1 - y, d2 - z, f, pt, ms, buffer, light);
}
public void renderParticles(MatrixStack ms, IRenderTypeBuffer buffer, ActiveRenderInfo ari) {
particles.renderParticles(ms, buffer, ari);
public void renderParticles(MatrixStack ms, IRenderTypeBuffer buffer, ActiveRenderInfo ari, float pt) {
particles.renderParticles(ms, buffer, ari, pt);
}
public void tick() {

View file

@ -59,10 +59,9 @@ public class PonderWorldParticles {
}
}
public void renderParticles(MatrixStack ms, IRenderTypeBuffer buffer, ActiveRenderInfo p_228345_4_) {
public void renderParticles(MatrixStack ms, IRenderTypeBuffer buffer, ActiveRenderInfo p_228345_4_, float p_228345_5_) {
Minecraft mc = Minecraft.getInstance();
LightTexture p_228345_3_ = mc.gameRenderer.getLightmapTextureManager();
float p_228345_5_ = mc.getRenderPartialTicks();
p_228345_3_.enableLightmap();
Runnable enable = () -> {

View file

@ -5,7 +5,6 @@ import com.simibubi.create.foundation.ponder.PonderWorld;
import com.simibubi.create.foundation.utility.LerpedFloat;
import com.simibubi.create.foundation.utility.MatrixStacker;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.util.math.MathHelper;
@ -24,7 +23,7 @@ public abstract class AnimatedSceneElement extends PonderSceneElement {
public void forceApplyFade(float fade) {
this.fade.startWithValue(fade);
}
public void setFade(float fade) {
this.fade.setValue(fade);
}
@ -32,46 +31,46 @@ public abstract class AnimatedSceneElement extends PonderSceneElement {
public void setFadeVec(Vec3d fadeVec) {
this.fadeVec = fadeVec;
}
@Override
public final void renderFirst(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms) {
public final void renderFirst(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float pt) {
ms.push();
float currentFade = applyFade(ms);
renderFirst(world, buffer, ms, currentFade);
float currentFade = applyFade(ms, pt);
renderFirst(world, buffer, ms, currentFade, pt);
ms.pop();
}
@Override
public final void renderLayer(PonderWorld world, IRenderTypeBuffer buffer, RenderType type, MatrixStack ms) {
public final void renderLayer(PonderWorld world, IRenderTypeBuffer buffer, RenderType type, MatrixStack ms,
float pt) {
ms.push();
float currentFade = applyFade(ms);
renderLayer(world, buffer, type, ms, currentFade);
ms.pop();
}
@Override
public final void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms) {
ms.push();
float currentFade = applyFade(ms);
renderLast(world, buffer, ms, currentFade);
float currentFade = applyFade(ms, pt);
renderLayer(world, buffer, type, ms, currentFade, pt);
ms.pop();
}
protected float applyFade(MatrixStack ms) {
float currentFade = fade.getValue(Minecraft.getInstance()
.getRenderPartialTicks());
@Override
public final void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float pt) {
ms.push();
float currentFade = applyFade(ms, pt);
renderLast(world, buffer, ms, currentFade, pt);
ms.pop();
}
protected float applyFade(MatrixStack ms, float pt) {
float currentFade = fade.getValue(pt);
if (fadeVec != null)
MatrixStacker.of(ms)
.translate(fadeVec.scale(-1 + currentFade));
return currentFade;
}
protected void renderLayer(PonderWorld world, IRenderTypeBuffer buffer, RenderType type, MatrixStack ms,
float fade) {}
protected void renderLayer(PonderWorld world, IRenderTypeBuffer buffer, RenderType type, MatrixStack ms, float fade,
float pt) {}
protected void renderFirst(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade) {}
protected void renderFirst(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade, float pt) {}
protected void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade) {}
protected void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade, float pt) {}
protected int lightCoordsFromFade(float fade) {
int light = 0xF000F0;

View file

@ -62,11 +62,9 @@ public class ParrotElement extends AnimatedSceneElement {
}
@Override
protected void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade) {
protected void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade, float pt) {
EntityRendererManager entityrenderermanager = Minecraft.getInstance()
.getRenderManager();
float pt = Minecraft.getInstance()
.getRenderPartialTicks();
if (entity == null)
pose.create(world);

View file

@ -9,10 +9,10 @@ import net.minecraft.client.renderer.RenderType;
public abstract class PonderSceneElement extends PonderElement {
public abstract void renderFirst(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms);
public abstract void renderFirst(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float pt);
public abstract void renderLayer(PonderWorld world, IRenderTypeBuffer buffer, RenderType type, MatrixStack ms);
public abstract void renderLayer(PonderWorld world, IRenderTypeBuffer buffer, RenderType type, MatrixStack ms, float pt);
public abstract void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms);
public abstract void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float pt);
}

View file

@ -31,12 +31,12 @@ public abstract class TrackedElement<T> extends PonderSceneElement {
}
@Override
public void renderFirst(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms) {}
public void renderFirst(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float pt) {}
@Override
public void renderLayer(PonderWorld world, IRenderTypeBuffer buffer, RenderType type, MatrixStack ms) {}
public void renderLayer(PonderWorld world, IRenderTypeBuffer buffer, RenderType type, MatrixStack ms, float pt) {}
@Override
public void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms) {}
public void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float pt) {}
}

View file

@ -4,10 +4,10 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import org.apache.commons.lang3.tuple.Pair;
import org.lwjgl.opengl.GL11;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.systems.RenderSystem;
import com.simibubi.create.CreateClient;
import com.simibubi.create.foundation.ponder.PonderScene;
import com.simibubi.create.foundation.ponder.PonderWorld;
@ -16,8 +16,10 @@ import com.simibubi.create.foundation.render.Compartment;
import com.simibubi.create.foundation.render.SuperByteBuffer;
import com.simibubi.create.foundation.render.SuperByteBufferCache;
import com.simibubi.create.foundation.render.TileEntityRenderHelper;
import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer;
import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.simibubi.create.foundation.utility.MatrixStacker;
import com.simibubi.create.foundation.utility.Pair;
import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.block.BlockRenderType;
@ -30,13 +32,22 @@ import net.minecraft.client.renderer.BufferBuilder;
import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.RenderTypeLookup;
import net.minecraft.client.renderer.WorldRenderer;
import net.minecraft.client.renderer.texture.OverlayTexture;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.fluid.IFluidState;
import net.minecraft.tileentity.ITickableTileEntity;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.RayTraceContext;
import net.minecraft.util.math.RayTraceContext.BlockMode;
import net.minecraft.util.math.RayTraceContext.FluidMode;
import net.minecraft.util.math.Vec3d;
import net.minecraft.util.math.shapes.ISelectionContext;
import net.minecraft.util.math.shapes.VoxelShape;
import net.minecraftforge.client.ForgeHooksClient;
import net.minecraftforge.client.model.data.EmptyModelData;
@ -54,6 +65,8 @@ public class WorldSectionElement extends AnimatedSceneElement {
Vec3d animatedRotation = Vec3d.ZERO;
Vec3d centerOfRotation = Vec3d.ZERO;
BlockPos selectedBlock;
public WorldSectionElement() {}
public WorldSectionElement(Selection section) {
@ -91,15 +104,24 @@ public class WorldSectionElement extends AnimatedSceneElement {
public void reset(PonderScene scene) {
super.reset(scene);
resetAnimatedTransform();
resetSelectedBlock();
}
public void selectBlock(BlockPos pos) {
selectedBlock = pos;
}
public void resetSelectedBlock() {
selectedBlock = null;
}
public void resetAnimatedTransform() {
prevAnimatedOffset = Vec3d.ZERO;
animatedOffset = Vec3d.ZERO;
prevAnimatedRotation = Vec3d.ZERO;
animatedRotation = Vec3d.ZERO;
}
public void queueRedraw() {
redraw = true;
}
@ -133,6 +155,57 @@ public class WorldSectionElement extends AnimatedSceneElement {
return super.isVisible() && !isEmpty();
}
class WorldSectionRayTraceResult {
Vec3d actualHitVec;
BlockPos worldPos;
}
public Pair<Vec3d, BlockPos> rayTrace(PonderWorld world, Vec3d source, Vec3d target) {
world.setMask(this.section);
Vec3d transformedTarget = reverseTransformVec(target);
BlockRayTraceResult rayTraceBlocks = world.rayTraceBlocks(new RayTraceContext(reverseTransformVec(source),
transformedTarget, BlockMode.OUTLINE, FluidMode.NONE, null));
world.clearMask();
if (rayTraceBlocks == null)
return null;
if (rayTraceBlocks.getHitVec() == null)
return null;
double t = rayTraceBlocks.getHitVec()
.subtract(transformedTarget)
.lengthSquared()
/ source.subtract(target)
.lengthSquared();
Vec3d actualHit = VecHelper.lerp((float) t, target, source);
return Pair.of(actualHit, rayTraceBlocks.getPos());
}
private Vec3d reverseTransformVec(Vec3d in) {
float pt = AnimationTickHolder.getPartialTicks();
in = in.subtract(VecHelper.lerp(pt, prevAnimatedOffset, animatedOffset));
if (!animatedRotation.equals(Vec3d.ZERO) || !prevAnimatedRotation.equals(Vec3d.ZERO)) {
in = in.subtract(centerOfRotation);
in = VecHelper.rotate(in, -MathHelper.lerp(pt, prevAnimatedRotation.x, animatedRotation.x), Axis.X);
in = VecHelper.rotate(in, -MathHelper.lerp(pt, prevAnimatedRotation.z, animatedRotation.z), Axis.Z);
in = VecHelper.rotate(in, -MathHelper.lerp(pt, prevAnimatedRotation.y, animatedRotation.y), Axis.Y);
in = in.add(centerOfRotation);
}
return in;
}
public void transformMS(MatrixStack ms, float pt) {
MatrixStacker.of(ms)
.translate(VecHelper.lerp(pt, prevAnimatedOffset, animatedOffset));
if (!animatedRotation.equals(Vec3d.ZERO) || !prevAnimatedRotation.equals(Vec3d.ZERO))
MatrixStacker.of(ms)
.translate(centerOfRotation)
.rotateX(MathHelper.lerp(pt, prevAnimatedRotation.x, animatedRotation.x))
.rotateZ(MathHelper.lerp(pt, prevAnimatedRotation.z, animatedRotation.z))
.rotateY(MathHelper.lerp(pt, prevAnimatedRotation.y, animatedRotation.y))
.translateBack(centerOfRotation);
}
public void tick(PonderScene scene) {
prevAnimatedOffset = animatedOffset;
prevAnimatedRotation = animatedRotation;
@ -147,46 +220,22 @@ public class WorldSectionElement extends AnimatedSceneElement {
}
@Override
protected void renderLayer(PonderWorld world, IRenderTypeBuffer buffer, RenderType type, MatrixStack ms,
float fade) {
float pt = AnimationTickHolder.getPartialTicks();
MatrixStacker.of(ms)
.translate(VecHelper.lerp(pt, prevAnimatedOffset, animatedOffset));
if (!animatedRotation.equals(Vec3d.ZERO) || !prevAnimatedRotation.equals(Vec3d.ZERO))
MatrixStacker.of(ms)
.translate(centerOfRotation)
.rotateX(MathHelper.lerp(pt, prevAnimatedRotation.x, animatedRotation.x))
.rotateZ(MathHelper.lerp(pt, prevAnimatedRotation.z, animatedRotation.z))
.rotateY(MathHelper.lerp(pt, prevAnimatedRotation.y, animatedRotation.y))
.translateBack(centerOfRotation);
protected void renderLayer(PonderWorld world, IRenderTypeBuffer buffer, RenderType type, MatrixStack ms, float fade,
float pt) {
transformMS(ms, pt);
renderStructure(world, ms, buffer, type, fade);
}
@Override
public void renderFirst(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade) {
public void renderFirst(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade, float pt) {
int light = -1;
if (fade != 1)
light = (int) (MathHelper.lerp(fade, 5, 14));
if (redraw)
renderedTileEntities = null;
//TODO: extract method
float pt = AnimationTickHolder.getPartialTicks();
MatrixStacker.of(ms)
.translate(VecHelper.lerp(pt, prevAnimatedOffset, animatedOffset));
if (!animatedRotation.equals(Vec3d.ZERO) || !prevAnimatedRotation.equals(Vec3d.ZERO))
MatrixStacker.of(ms)
.translate(centerOfRotation)
.rotateX(MathHelper.lerp(pt, prevAnimatedRotation.x, animatedRotation.x))
.rotateZ(MathHelper.lerp(pt, prevAnimatedRotation.z, animatedRotation.z))
.rotateY(MathHelper.lerp(pt, prevAnimatedRotation.y, animatedRotation.y))
.translateBack(centerOfRotation);
transformMS(ms, pt);
world.pushFakeLight(light);
renderTileEntities(world, ms, buffer);
renderTileEntities(world, ms, buffer, pt);
world.popLight();
}
@ -210,11 +259,30 @@ public class WorldSectionElement extends AnimatedSceneElement {
}
@Override
protected void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade) {
protected void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade, float pt) {
redraw = false;
if (selectedBlock == null)
return;
BlockState blockState = world.getBlockState(selectedBlock);
if (blockState.isAir(world, selectedBlock))
return;
VoxelShape shape =
blockState.getShape(world, selectedBlock, ISelectionContext.forEntity(Minecraft.getInstance().player));
if (shape.isEmpty())
return;
ms.push();
transformMS(ms, pt);
RenderSystem.disableTexture();
WorldRenderer.drawBox(ms, buffer.getBuffer(RenderType.getLines()), shape.getBoundingBox()
.offset(selectedBlock), 1, 1, 1, 1);
if (buffer instanceof SuperRenderTypeBuffer)
((SuperRenderTypeBuffer) buffer).draw(RenderType.getLines());
RenderSystem.enableTexture();
ms.pop();
}
private void renderTileEntities(PonderWorld world, MatrixStack ms, IRenderTypeBuffer buffer) {
private void renderTileEntities(PonderWorld world, MatrixStack ms, IRenderTypeBuffer buffer, float pt) {
if (renderedTileEntities == null) {
renderedTileEntities = new ArrayList<>();
section.forEach(pos -> {
@ -224,8 +292,7 @@ public class WorldSectionElement extends AnimatedSceneElement {
});
} else
renderedTileEntities.removeIf(te -> world.getTileEntity(te.getPos()) != te);
TileEntityRenderHelper.renderTileEntities(world, renderedTileEntities, ms, new MatrixStack(), buffer);
TileEntityRenderHelper.renderTileEntities(world, renderedTileEntities, ms, new MatrixStack(), buffer, pt);
}
private SuperByteBuffer buildStructureBuffer(PonderWorld world, RenderType layer) {

View file

@ -24,13 +24,23 @@ public class TileEntityRenderHelper {
public static void renderTileEntities(World world, Iterable<TileEntity> customRenderTEs, MatrixStack ms,
MatrixStack localTransform, IRenderTypeBuffer buffer) {
renderTileEntities(world, null, customRenderTEs, ms, localTransform, buffer);
}
public static void renderTileEntities(World world, Iterable<TileEntity> customRenderTEs, MatrixStack ms,
MatrixStack localTransform, IRenderTypeBuffer buffer, float pt) {
renderTileEntities(world, null, customRenderTEs, ms, localTransform, buffer, pt);
}
public static void renderTileEntities(World world, PlacementSimulationWorld renderWorld, Iterable<TileEntity> customRenderTEs, MatrixStack ms,
MatrixStack localTransform, IRenderTypeBuffer buffer) {
float pt = AnimationTickHolder.getPartialTicks();
public static void renderTileEntities(World world, PlacementSimulationWorld renderWorld,
Iterable<TileEntity> customRenderTEs, MatrixStack ms, MatrixStack localTransform, IRenderTypeBuffer buffer) {
renderTileEntities(world, renderWorld, customRenderTEs, ms, localTransform, buffer,
AnimationTickHolder.getPartialTicks());
}
public static void renderTileEntities(World world, PlacementSimulationWorld renderWorld,
Iterable<TileEntity> customRenderTEs, MatrixStack ms, MatrixStack localTransform, IRenderTypeBuffer buffer,
float pt) {
Matrix4f matrix = localTransform.peek()
.getModel();

View file

@ -5,6 +5,7 @@ import java.util.ArrayList;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher;
import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer;
import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.simibubi.create.foundation.utility.Pair;
import com.simibubi.create.foundation.utility.outliner.AABBOutline;
@ -29,6 +30,6 @@ public class LightVolumeDebugger {
outline.getParams().colored(pair.getSecond());
return outline;
})
.forEach(outline -> outline.render(ms, buffer));
.forEach(outline -> outline.render(ms, buffer, AnimationTickHolder.getPartialTicks()));
}
}

View file

@ -73,7 +73,7 @@ public class ValueBox extends ChasingAABBOutline {
}
@Override
public void render(MatrixStack ms, SuperRenderTypeBuffer buffer) {
public void render(MatrixStack ms, SuperRenderTypeBuffer buffer, float pt) {
boolean hasTransform = transform != null;
if (transform instanceof Sided && params.getHighlightedFace() != null)
((Sided) transform).fromSide(params.getHighlightedFace());
@ -88,7 +88,7 @@ public class ValueBox extends ChasingAABBOutline {
.getNormal()
.copy();
params.colored(isPassive ? passiveColor : highlightColor);
super.render(ms, buffer);
super.render(ms, buffer, pt);
float fontScale = hasTransform ? -transform.getFontScale() : -1 / 64f;
ms.scale(fontScale, fontScale, fontScale);

View file

@ -22,7 +22,7 @@ public class AABBOutline extends Outline {
}
@Override
public void render(MatrixStack ms, SuperRenderTypeBuffer buffer) {
public void render(MatrixStack ms, SuperRenderTypeBuffer buffer, float pt) {
renderBB(ms, buffer, bb);
}

View file

@ -30,7 +30,7 @@ public class BlockClusterOutline extends Outline {
}
@Override
public void render(MatrixStack ms, SuperRenderTypeBuffer buffer) {
public void render(MatrixStack ms, SuperRenderTypeBuffer buffer, float pt) {
for (MergeEntry edge : cluster.visibleEdges) {
Vec3d start = new Vec3d(edge.pos);
Direction direction = Direction.getFacingFromAxis(AxisDirection.POSITIVE, edge.axis);

View file

@ -2,7 +2,6 @@ package com.simibubi.create.foundation.utility.outliner;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer;
import com.simibubi.create.foundation.utility.AnimationTickHolder;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.MathHelper;
@ -29,8 +28,8 @@ public class ChasingAABBOutline extends AABBOutline {
}
@Override
public void render(MatrixStack ms, SuperRenderTypeBuffer buffer) {
renderBB(ms, buffer, interpolateBBs(prevBB, bb, AnimationTickHolder.getPartialTicks()));
public void render(MatrixStack ms, SuperRenderTypeBuffer buffer, float pt) {
renderBB(ms, buffer, interpolateBBs(prevBB, bb, pt));
}
private static AxisAlignedBB interpolateBBs(AxisAlignedBB current, AxisAlignedBB target, float pt) {

View file

@ -2,7 +2,6 @@ package com.simibubi.create.foundation.utility.outliner;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer;
import com.simibubi.create.foundation.utility.AnimationTickHolder;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3d;
@ -19,7 +18,7 @@ public class LineOutline extends Outline {
}
@Override
public void render(MatrixStack ms, SuperRenderTypeBuffer buffer) {
public void render(MatrixStack ms, SuperRenderTypeBuffer buffer, float pt) {
renderCuboidLine(ms, buffer, start, end);
}
@ -46,8 +45,7 @@ public class LineOutline extends Outline {
}
@Override
public void render(MatrixStack ms, SuperRenderTypeBuffer buffer) {
float pt = AnimationTickHolder.getPartialTicks();
public void render(MatrixStack ms, SuperRenderTypeBuffer buffer, float pt) {
float distanceToTarget = 1 - MathHelper.lerp(pt, prevProgress, progress);
Vec3d start = end.add(this.start.subtract(end)
.scale(distanceToTarget));

View file

@ -31,7 +31,7 @@ public abstract class Outline {
params = new OutlineParams();
}
public abstract void render(MatrixStack ms, SuperRenderTypeBuffer buffer);
public abstract void render(MatrixStack ms, SuperRenderTypeBuffer buffer, float pt);
public void renderCuboidLine(MatrixStack ms, SuperRenderTypeBuffer buffer, Vec3d start, Vec3d end) {
Vec3d diff = end.subtract(start);

View file

@ -10,7 +10,6 @@ import java.util.Set;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer;
import com.simibubi.create.foundation.tileEntity.behaviour.ValueBox;
import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.simibubi.create.foundation.utility.outliner.LineOutline.EndChasingLineOutline;
import com.simibubi.create.foundation.utility.outliner.Outline.OutlineParams;
@ -146,7 +145,7 @@ public class Outliner {
toClear.forEach(outlines::remove);
}
public void renderOutlines(MatrixStack ms, SuperRenderTypeBuffer buffer) {
public void renderOutlines(MatrixStack ms, SuperRenderTypeBuffer buffer, float pt) {
outlines.forEach((key, entry) -> {
Outline outline = entry.getOutline();
outline.params.alpha = 1;
@ -156,13 +155,13 @@ public class Outliner {
float fadeticks = OutlineEntry.fadeTicks;
float lastAlpha = prevTicks >= 0 ? 1 : 1 + (prevTicks / fadeticks);
float currentAlpha = 1 + (entry.ticksTillRemoval / fadeticks);
float alpha = MathHelper.lerp(AnimationTickHolder.getPartialTicks(), lastAlpha, currentAlpha);
float alpha = MathHelper.lerp(pt, lastAlpha, currentAlpha);
outline.params.alpha = alpha * alpha * alpha;
if (outline.params.alpha < 1 / 8f)
return;
}
outline.render(ms, buffer);
outline.render(ms, buffer, pt);
});
}