*/}}
Browse Source

Separate shader strings. Marco fixes.

YimingWu 1 year ago
parent
commit
99e773e776
10 changed files with 510 additions and 1033 deletions
  1. 133 133
      la_icon.h
  2. 5 5
      la_interface.h
  3. 1 1
      la_kernel.c
  4. 27 10
      la_tns.h
  5. 14 312
      la_tns_kernel.c
  6. 11 11
      la_util.h
  7. 2 2
      resources/la_modelling.c
  8. 5 5
      resources/la_nodes_basic.c
  9. 0 554
      resources/la_tns_als.c
  10. 312 0
      resources/la_tns_shaders.cpp

+ 133 - 133
la_icon.h

@@ -20,240 +20,240 @@
 
 // arrows
 #ifndef _LA_ICO_ARROWS
-#define _LA_ICO_ARROWS\
-"←↑→↓↔↕↖↗↘↙↩↪↯⇦⇧⇨⇩⇪⇫⇬⇭⇮⇯⇰⇳⤡⤢⤴⤵🠀🠁🠂🠃🠄🠅🠆🠇🠈🠉🠊"\
-"🠋🠐🠑🠒🠓🠔🠕🠖🠗🠘🠙🠚🠛🠜🠝🠞🠟🠠🠡🠢🠣🠤🠥🠦🠧🠨🠩🠪🠫🠬🠭🠮🠯🠰🠱🠲🠳🠴🠵🠶"\
-"🠷🠸🠹🠺🠻🠼🠽🠾🠿🡀🡁🡂🡃🡄🡅🡆🡇🡐🡑🡒🡓🡔🡕🡖🡗🡘🡙🡠🡡🡢🡣🡤🡥🡦🡧🡨🡩🡪🡫🡬"\
-"🡭🡮🡯🡰🡱🡲🡳🡴🡵🡶🡷🡸🡹🡺🡻🡼🡽🡾🡿🢀🢁🢂🢃🢄🢅🢆🢇🢐🢑🢒🢓🢔🢕🢖🢗🢘🢙🢚🢛🢜"\
+#define _LA_ICO_ARROWS \
+"←↑→↓↔↕↖↗↘↙↩↪↯⇦⇧⇨⇩⇪⇫⇬⇭⇮⇯⇰⇳⤡⤢⤴⤵🠀🠁🠂🠃🠄🠅🠆🠇🠈🠉🠊" \
+"🠋🠐🠑🠒🠓🠔🠕🠖🠗🠘🠙🠚🠛🠜🠝🠞🠟🠠🠡🠢🠣🠤🠥🠦🠧🠨🠩🠪🠫🠬🠭🠮🠯🠰🠱🠲🠳🠴🠵🠶" \
+"🠷🠸🠹🠺🠻🠼🠽🠾🠿🡀🡁🡂🡃🡄🡅🡆🡇🡐🡑🡒🡓🡔🡕🡖🡗🡘🡙🡠🡡🡢🡣🡤🡥🡦🡧🡨🡩🡪🡫🡬" \
+"🡭🡮🡯🡰🡱🡲🡳🡴🡵🡶🡷🡸🡹🡺🡻🡼🡽🡾🡿🢀🢁🢂🢃🢄🢅🢆🢇🢐🢑🢒🢓🢔🢕🢖🢗🢘🢙🢚🢛🢜" \
 "🢝🢞🢟🢠🢡🢢🢣🢤🢥🢦🢧🢨🢩🢪🢫🢬🢭🢰🢱"
 ;
 #endif
 
 // dingbats
 #ifndef _LA_ICO_DINGBATS
-#define _LA_ICO_DINGBATS\
-"∘∙⊙⋄⋅⋆✀✁✂✃✄✅✆✇✈✉✊✋✌✍✎✏✐✑✒✓✔✕✖✗✘✙✚✛✜✝✞✟✠✡"\
-"✢✣✤✥✦✧✨✩✪✫✬✭✮✯✰✱✲✳✴✵✶✷✸✹✺✻✼✽✾✿❀❁❂❃❄❅❆❇❈❉"\
-"❊❋❌❍❎❏❐❑❒❓❔❕❖❗❘❙❚❛❜❝❞❟❠❡❢❣❤❥❦❧❨❩❪❫❬❭❮❯❰❱"\
-"❲❳❴❵❶❷❸❹❺❻❼❽❾❿➀➁➂➃➄➅➆➇➈➉➊➋➌➍➎➏➐➑➒➓➔➕➖➗➘➙"\
-"➚➛➜➝➞➟➠➡➢➣➤➥➦➧➨➩➪➫➬➭➮➯➰➱➲➳➴➵➶➷➸➹➺➻➼➽➾➿🙐🙑"\
-"🙒🙓🙔🙕🙖🙗🙘🙙🙚🙛🙜🙝🙞🙟🙠🙡🙢🙣🙤🙥🙦🙧🙨🙩🙪🙫🙬🙭🙮🙯🙰🙱🙲🙳🙴🙵🙶🙷🙸🙹"\
+#define _LA_ICO_DINGBATS \
+"∘∙⊙⋄⋅⋆✀✁✂✃✄✅✆✇✈✉✊✋✌✍✎✏✐✑✒✓✔✕✖✗✘✙✚✛✜✝✞✟✠✡" \
+"✢✣✤✥✦✧✨✩✪✫✬✭✮✯✰✱✲✳✴✵✶✷✸✹✺✻✼✽✾✿❀❁❂❃❄❅❆❇❈❉" \
+"❊❋❌❍❎❏❐❑❒❓❔❕❖❗❘❙❚❛❜❝❞❟❠❡❢❣❤❥❦❧❨❩❪❫❬❭❮❯❰❱" \
+"❲❳❴❵❶❷❸❹❺❻❼❽❾❿➀➁➂➃➄➅➆➇➈➉➊➋➌➍➎➏➐➑➒➓➔➕➖➗➘➙" \
+"➚➛➜➝➞➟➠➡➢➣➤➥➦➧➨➩➪➫➬➭➮➯➰➱➲➳➴➵➶➷➸➹➺➻➼➽➾➿🙐🙑" \
+"🙒🙓🙔🙕🙖🙗🙘🙙🙚🙛🙜🙝🙞🙟🙠🙡🙢🙣🙤🙥🙦🙧🙨🙩🙪🙫🙬🙭🙮🙯🙰🙱🙲🙳🙴🙵🙶🙷🙸🙹" \
 "🙺🙻🙼🙽🙾🙿"
 ;
 #endif
 
 // tech
 #ifndef _LA_ICO_TECH
-#define _LA_ICO_TECH\
-"⌀⌁⌂⌃⌄⌅⌆⌇⌈⌉⌊⌋⌌⌍⌎⌏⌑⌒⌓⌔⌕⌖⌗⌘⌚⌛⌜⌝⌞⌟⌢⌣⌤⌥⌦⌧⌨〈〉⌫"\
-"⌬⌭⌮⌯⌰⌱⌲⌳⌴⌵⍻⍼⍽⍾⍿⎀⎁⎂⎃⎄⎅⎆⎇⎈⎉⎊⎋⎌⎍⎎⎏⎐⎑⎒⎓⎔⎖⎗⎘⎙"\
-"⎚⎯⎾⎿⏀⏁⏂⏃⏄⏅⏆⏇⏈⏉⏊⏋⏌⏍⏎⏏⏐⏑⏒⏓⏔⏕⏖⏗⏘⏙⏚⏛⏢⏣⏤⏥⏦⏧⏨⏩"\
+#define _LA_ICO_TECH \
+"⌀⌁⌂⌃⌄⌅⌆⌇⌈⌉⌊⌋⌌⌍⌎⌏⌑⌒⌓⌔⌕⌖⌗⌘⌚⌛⌜⌝⌞⌟⌢⌣⌤⌥⌦⌧⌨〈〉⌫" \
+"⌬⌭⌮⌯⌰⌱⌲⌳⌴⌵⍻⍼⍽⍾⍿⎀⎁⎂⎃⎄⎅⎆⎇⎈⎉⎊⎋⎌⎍⎎⎏⎐⎑⎒⎓⎔⎖⎗⎘⎙" \
+"⎚⎯⎾⎿⏀⏁⏂⏃⏄⏅⏆⏇⏈⏉⏊⏋⏌⏍⏎⏏⏐⏑⏒⏓⏔⏕⏖⏗⏘⏙⏚⏛⏢⏣⏤⏥⏦⏧⏨⏩" \
 "⏪⏫⏬⏭⏮⏯⏰⏱⏲⏳⏴⏵⏶⏷⏸⏹⏺⏻⏼⏽⏾⏿"
 ;
 #endif
 
 // geom
 #ifndef _LA_ICO_GEOM
-#define _LA_ICO_GEOM\
-"■□▢▣▤▥▦▧▨▩▪▫▬▭▮▯▰▱▲△▴▵▶▷▸▹►▻▼▽▾▿◀◁◂◃◄◅◆◇"\
-"◈◉◊○◌◍◎●◐◑◒◓◔◕◖◗◘◙◚◛◜◝◞◟◠◡◢◣◤◥◦◧◨◩◪◫◬◭◮◯"\
-"◰◱◲◳◴◵◶◷◸◹◺◻◼◽◾◿🞀🞁🞂🞃🞄🞅🞆🞇🞈🞉🞊🞋🞌🞍🞎🞏🞐🞑🞒🞓🞔🞕🞖🞗"\
-"🞘🞙🞚🞛🞜🞝🞞🞟🞠🞡🞢🞣🞤🞥🞦🞧🞨🞩🞪🞫🞬🞭🞮🞯🞰🞱🞲🞳🞴🞵🞶🞷🞸🞹🞺🞻🞼🞽🞾🞿"\
+#define _LA_ICO_GEOM \
+"■□▢▣▤▥▦▧▨▩▪▫▬▭▮▯▰▱▲△▴▵▶▷▸▹►▻▼▽▾▿◀◁◂◃◄◅◆◇" \
+"◈◉◊○◌◍◎●◐◑◒◓◔◕◖◗◘◙◚◛◜◝◞◟◠◡◢◣◤◥◦◧◨◩◪◫◬◭◮◯" \
+"◰◱◲◳◴◵◶◷◸◹◺◻◼◽◾◿🞀🞁🞂🞃🞄🞅🞆🞇🞈🞉🞊🞋🞌🞍🞎🞏🞐🞑🞒🞓🞔🞕🞖🞗" \
+"🞘🞙🞚🞛🞜🞝🞞🞟🞠🞡🞢🞣🞤🞥🞦🞧🞨🞩🞪🞫🞬🞭🞮🞯🞰🞱🞲🞳🞴🞵🞶🞷🞸🞹🞺🞻🞼🞽🞾🞿" \
 "🟀🟁🟂🟃🟄🟅🟆🟇🟈🟉🟊🟋🟌🟍🟎🟏🟐🟑🟒🟓🟔🟕🟖🟗🟘🟠🟡🟢🟣🟤🟥🟦🟧🟨🟩🟪🟫🟰"
 ;
 #endif
 
 // misc
 #ifndef _LA_ICO_MISC
-#define _LA_ICO_MISC\
-"☀☁☂☃☄★☆☇☈☉☊☋☌☍☎☏☐☑☒☓☔☕☖☗☘☙☚☛☜☝☞☟☠☡☢☣☤☥☦☧"\
-"☨☩☪☫☬☭☮☯☰☱☲☳☴☵☶☷☸☹☺☻☼☽☾☿♀♁♂♃♄♅♆♇♈♉♊♋♌♍♎♏"\
-"♐♑♒♓♔♕♖♗♘♙♚♛♜♝♞♟♠♡♢♣♤♥♦♧♨♩♪♫♬♭♮♯♰♱♲♳♴♵♶♷"\
-"♸♹♺♻♼♽♾♿⚀⚁⚂⚃⚄⚅⚆⚇⚈⚉⚊⚋⚌⚍⚎⚏⚐⚑⚒⚓⚔⚕⚖⚗⚘⚙⚚⚛⚜⚝⚞⚟"\
-"⚠⚡⚢⚣⚤⚥⚦⚧⚨⚩⚪⚫⚬⚭⚮⚯⚰⚱⚲⚳⚴⚵⚶⚷⚸⚹⚺⚻⚼⚽⚾⚿⛀⛁⛂⛃⛄⛅⛆⛇"\
-"⛈⛉⛊⛋⛌⛍⛎⛏⛐⛑⛒⛓⛔⛕⛖⛗⛘⛙⛚⛛⛜⛝⛞⛟⛠⛡⛢⛣⛤⛥⛦⛧⛨⛩⛪⛫⛬⛭⛮⛯"\
-"⛰⛱⛲⛳⛴⛵⛶⛷⛸⛹⛺⛻⛼⛽⛾⛿⬀⬁⬂⬃⬄⬅⬆⬇⬈⬉⬊⬋⬌⬍⬒⬓⬔⬕⬖⬗⬘⬙⬚⬛"\
-"⬜⬝⬞⬟⬠⬡⬢⬣⬤⬥⬦⬧⬨⬩⬪⬫⬬⬭⬮⬯⭍⭎⭏⭐⭑⭒⭓⭔⭕⭖⭗⭘⭙⭚⭛⭜⭝⭞⭟⭠"\
-"⭡⭢⭣⭤⭥⭦⭧⭨⭩⭪⭫⭬⭭⭮⭯⭰⭱⭲⭳⭶⭷⭸⭹⭺⭻⭼⭽⭾⭿⮀⮁⮂⮃⮄⮅⮆⮇⮈⮉⮊"\
-"⮋⮌⮍⮎⮏⮐⮑⮒⮓⮔⮕⮗⮘⮙⮚⮛⮜⮝⮞⮟⮠⮡⮢⮣⮤⮥⮦⮧⮨⮩⮪⮫⮬⮭⮮⮯⮰⮱⮲⮳"\
-"⮴⮵⮶⮷⮸⮹⮺⮻⮼⮽⮾⮿⯀⯁⯂⯃⯄⯅⯆⯇⯈⯉⯊⯋⯌⯍⯎⯏⯐⯑⯒⯓⯔⯕⯖⯗⯘⯙⯚⯛"\
-"⯜⯝⯞⯟⯠⯡⯢⯣⯤⯥⯦⯧⯨⯩⯪⯫⯬⯭⯮⯯⯰⯱⯲⯳⯴⯵⯶⯷⯸⯹⯺⯻⯼⯽⯿🌀🌁🌂🌃🌄"\
-"🌅🌆🌇🌈🌉🌊🌋🌌🌍🌎🌏🌐🌑🌒🌓🌔🌕🌖🌗🌘🌙🌚🌛🌜🌝🌞🌟🌠🌡🌢🌣🌤🌥🌦🌧🌨🌩🌪🌫🌬"\
-"🌭🌮🌯🌰🌱🌲🌳🌴🌵🌶🌷🌸🌹🌺🌻🌼🌽🌾🌿🍀🍁🍂🍃🍄🍅🍆🍇🍈🍉🍊🍋🍌🍍🍎🍏🍐🍑🍒🍓🍔"\
-"🍕🍖🍗🍘🍙🍚🍛🍜🍝🍞🍟🍠🍡🍢🍣🍤🍥🍦🍧🍨🍩🍪🍫🍬🍭🍮🍯🍰🍱🍲🍳🍴🍵🍶🍷🍸🍹🍺🍻🍼"\
-"🍽🍾🍿🎀🎁🎂🎃🎄🎅🎆🎇🎈🎉🎊🎋🎌🎍🎎🎏🎐🎑🎒🎓🎔🎕🎖🎗🎘🎙🎚🎛🎜🎝🎞🎟🎠🎡🎢🎣🎤"\
-"🎥🎦🎧🎨🎩🎪🎫🎬🎭🎮🎯🎰🎱🎲🎳🎴🎵🎶🎷🎸🎹🎺🎻🎼🎽🎾🎿🏀🏁🏂🏃🏄🏅🏆🏇🏈🏉🏊🏋🏌"\
-"🏍🏎🏏🏐🏑🏒🏓🏔🏕🏖🏗🏘🏙🏚🏛🏜🏝🏞🏟🏠🏡🏢🏣🏤🏥🏦🏧🏨🏩🏪🏫🏬🏭🏮🏯🏰🏱🏲🏳🏴"\
-"🏵🏶🏷🏸🏹🏺🏻🏼🏽🏾🏿🐀🐁🐂🐃🐄🐅🐆🐇🐈🐉🐊🐋🐌🐍🐎🐏🐐🐑🐒🐓🐔🐕🐖🐗🐘🐙🐚🐛🐜"\
-"🐝🐞🐟🐠🐡🐢🐣🐤🐥🐦🐧🐨🐩🐪🐫🐬🐭🐮🐯🐰🐱🐲🐳🐴🐵🐶🐷🐸🐹🐺🐻🐼🐽🐾🐿👀👁👂👃👄"\
-"👅👆👇👈👉👊👋👌👍👎👏👐👑👒👓👔👕👖👗👘👙👚👛👜👝👞👟👠👡👢👣👤👥👦👧👨👩👪👫👬"\
-"👭👮👯👰👱👲👳👴👵👶👷👸👹👺👻👼👽👾👿💀💁💂💃💄💅💆💇💈💉💊💋💌💍💎💏💐💑💒💓💔"\
-"💕💖💗💘💙💚💛💜💝💞💟💠💡💢💣💤💥💦💧💨💩💪💫💬💭💮💯💰💱💲💳💴💵💶💷💸💹💺💻💼"\
-"💽💾💿📀📁📂📃📄📅📆📇📈📉📊📋📌📍📎📏📐📑📒📓📔📕📖📗📘📙📚📛📜📝📞📟📠📡📢📣📤"\
-"📥📦📧📨📩📪📫📬📭📮📯📰📱📲📳📴📵📶📷📸📹📺📻📼📽📾📿🔀🔁🔂🔃🔄🔅🔆🔇🔈🔉🔊🔋🔌"\
-"🔍🔎🔏🔐🔑🔒🔓🔔🔕🔖🔗🔘🔙🔚🔛🔜🔝🔞🔟🔠🔡🔢🔣🔤🔥🔦🔧🔨🔩🔪🔫🔬🔭🔮🔯🔰🔱🔲🔳🔴"\
-"🔵🔶🔷🔸🔹🔺🔻🔼🔽🔾🔿🕀🕁🕂🕃🕄🕅🕆🕇🕈🕉🕊🕋🕌🕍🕎🕏🕐🕑🕒🕓🕔🕕🕖🕗🕘🕙🕚🕛🕜"\
-"🕝🕞🕟🕠🕡🕢🕣🕤🕥🕦🕧🕨🕩🕪🕫🕬🕭🕮🕯🕰🕱🕲🕳🕴🕵🕶🕷🕸🕹🕺🕻🕼🕽🕾🕿🖀🖁🖂🖃🖄"\
-"🖅🖆🖇🖈🖉🖊🖋🖌🖍🖎🖏🖐🖑🖒🖓🖔🖕🖖🖗🖘🖙🖚🖛🖜🖝🖞🖟🖠🖡🖢🖣🖤🖥🖦🖧🖨🖩🖪🖫🖬"\
-"🖭🖮🖯🖰🖱🖲🖳🖴🖵🖶🖷🖸🖹🖺🖻🖼🖽🖾🖿🗀🗁🗂🗃🗄🗅🗆🗇🗈🗉🗊🗋🗌🗍🗎🗏🗐🗑🗒🗓🗔"\
-"🗕🗖🗗🗘🗙🗚🗛🗜🗝🗞🗟🗠🗡🗢🗣🗤🗥🗦🗧🗨🗩🗪🗫🗬🗭🗮🗯🗰🗱🗲🗳🗴🗵🗶🗷🗸🗹🗺🗻🗼"\
+#define _LA_ICO_MISC \
+"☀☁☂☃☄★☆☇☈☉☊☋☌☍☎☏☐☑☒☓☔☕☖☗☘☙☚☛☜☝☞☟☠☡☢☣☤☥☦☧" \
+"☨☩☪☫☬☭☮☯☰☱☲☳☴☵☶☷☸☹☺☻☼☽☾☿♀♁♂♃♄♅♆♇♈♉♊♋♌♍♎♏" \
+"♐♑♒♓♔♕♖♗♘♙♚♛♜♝♞♟♠♡♢♣♤♥♦♧♨♩♪♫♬♭♮♯♰♱♲♳♴♵♶♷" \
+"♸♹♺♻♼♽♾♿⚀⚁⚂⚃⚄⚅⚆⚇⚈⚉⚊⚋⚌⚍⚎⚏⚐⚑⚒⚓⚔⚕⚖⚗⚘⚙⚚⚛⚜⚝⚞⚟" \
+"⚠⚡⚢⚣⚤⚥⚦⚧⚨⚩⚪⚫⚬⚭⚮⚯⚰⚱⚲⚳⚴⚵⚶⚷⚸⚹⚺⚻⚼⚽⚾⚿⛀⛁⛂⛃⛄⛅⛆⛇" \
+"⛈⛉⛊⛋⛌⛍⛎⛏⛐⛑⛒⛓⛔⛕⛖⛗⛘⛙⛚⛛⛜⛝⛞⛟⛠⛡⛢⛣⛤⛥⛦⛧⛨⛩⛪⛫⛬⛭⛮⛯" \
+"⛰⛱⛲⛳⛴⛵⛶⛷⛸⛹⛺⛻⛼⛽⛾⛿⬀⬁⬂⬃⬄⬅⬆⬇⬈⬉⬊⬋⬌⬍⬒⬓⬔⬕⬖⬗⬘⬙⬚⬛" \
+"⬜⬝⬞⬟⬠⬡⬢⬣⬤⬥⬦⬧⬨⬩⬪⬫⬬⬭⬮⬯⭍⭎⭏⭐⭑⭒⭓⭔⭕⭖⭗⭘⭙⭚⭛⭜⭝⭞⭟⭠" \
+"⭡⭢⭣⭤⭥⭦⭧⭨⭩⭪⭫⭬⭭⭮⭯⭰⭱⭲⭳⭶⭷⭸⭹⭺⭻⭼⭽⭾⭿⮀⮁⮂⮃⮄⮅⮆⮇⮈⮉⮊" \
+"⮋⮌⮍⮎⮏⮐⮑⮒⮓⮔⮕⮗⮘⮙⮚⮛⮜⮝⮞⮟⮠⮡⮢⮣⮤⮥⮦⮧⮨⮩⮪⮫⮬⮭⮮⮯⮰⮱⮲⮳" \
+"⮴⮵⮶⮷⮸⮹⮺⮻⮼⮽⮾⮿⯀⯁⯂⯃⯄⯅⯆⯇⯈⯉⯊⯋⯌⯍⯎⯏⯐⯑⯒⯓⯔⯕⯖⯗⯘⯙⯚⯛" \
+"⯜⯝⯞⯟⯠⯡⯢⯣⯤⯥⯦⯧⯨⯩⯪⯫⯬⯭⯮⯯⯰⯱⯲⯳⯴⯵⯶⯷⯸⯹⯺⯻⯼⯽⯿🌀🌁🌂🌃🌄" \
+"🌅🌆🌇🌈🌉🌊🌋🌌🌍🌎🌏🌐🌑🌒🌓🌔🌕🌖🌗🌘🌙🌚🌛🌜🌝🌞🌟🌠🌡🌢🌣🌤🌥🌦🌧🌨🌩🌪🌫🌬" \
+"🌭🌮🌯🌰🌱🌲🌳🌴🌵🌶🌷🌸🌹🌺🌻🌼🌽🌾🌿🍀🍁🍂🍃🍄🍅🍆🍇🍈🍉🍊🍋🍌🍍🍎🍏🍐🍑🍒🍓🍔" \
+"🍕🍖🍗🍘🍙🍚🍛🍜🍝🍞🍟🍠🍡🍢🍣🍤🍥🍦🍧🍨🍩🍪🍫🍬🍭🍮🍯🍰🍱🍲🍳🍴🍵🍶🍷🍸🍹🍺🍻🍼" \
+"🍽🍾🍿🎀🎁🎂🎃🎄🎅🎆🎇🎈🎉🎊🎋🎌🎍🎎🎏🎐🎑🎒🎓🎔🎕🎖🎗🎘🎙🎚🎛🎜🎝🎞🎟🎠🎡🎢🎣🎤" \
+"🎥🎦🎧🎨🎩🎪🎫🎬🎭🎮🎯🎰🎱🎲🎳🎴🎵🎶🎷🎸🎹🎺🎻🎼🎽🎾🎿🏀🏁🏂🏃🏄🏅🏆🏇🏈🏉🏊🏋🏌" \
+"🏍🏎🏏🏐🏑🏒🏓🏔🏕🏖🏗🏘🏙🏚🏛🏜🏝🏞🏟🏠🏡🏢🏣🏤🏥🏦🏧🏨🏩🏪🏫🏬🏭🏮🏯🏰🏱🏲🏳🏴" \
+"🏵🏶🏷🏸🏹🏺🏻🏼🏽🏾🏿🐀🐁🐂🐃🐄🐅🐆🐇🐈🐉🐊🐋🐌🐍🐎🐏🐐🐑🐒🐓🐔🐕🐖🐗🐘🐙🐚🐛🐜" \
+"🐝🐞🐟🐠🐡🐢🐣🐤🐥🐦🐧🐨🐩🐪🐫🐬🐭🐮🐯🐰🐱🐲🐳🐴🐵🐶🐷🐸🐹🐺🐻🐼🐽🐾🐿👀👁👂👃👄" \
+"👅👆👇👈👉👊👋👌👍👎👏👐👑👒👓👔👕👖👗👘👙👚👛👜👝👞👟👠👡👢👣👤👥👦👧👨👩👪👫👬" \
+"👭👮👯👰👱👲👳👴👵👶👷👸👹👺👻👼👽👾👿💀💁💂💃💄💅💆💇💈💉💊💋💌💍💎💏💐💑💒💓💔" \
+"💕💖💗💘💙💚💛💜💝💞💟💠💡💢💣💤💥💦💧💨💩💪💫💬💭💮💯💰💱💲💳💴💵💶💷💸💹💺💻💼" \
+"💽💾💿📀📁📂📃📄📅📆📇📈📉📊📋📌📍📎📏📐📑📒📓📔📕📖📗📘📙📚📛📜📝📞📟📠📡📢📣📤" \
+"📥📦📧📨📩📪📫📬📭📮📯📰📱📲📳📴📵📶📷📸📹📺📻📼📽📾📿🔀🔁🔂🔃🔄🔅🔆🔇🔈🔉🔊🔋🔌" \
+"🔍🔎🔏🔐🔑🔒🔓🔔🔕🔖🔗🔘🔙🔚🔛🔜🔝🔞🔟🔠🔡🔢🔣🔤🔥🔦🔧🔨🔩🔪🔫🔬🔭🔮🔯🔰🔱🔲🔳🔴" \
+"🔵🔶🔷🔸🔹🔺🔻🔼🔽🔾🔿🕀🕁🕂🕃🕄🕅🕆🕇🕈🕉🕊🕋🕌🕍🕎🕏🕐🕑🕒🕓🕔🕕🕖🕗🕘🕙🕚🕛🕜" \
+"🕝🕞🕟🕠🕡🕢🕣🕤🕥🕦🕧🕨🕩🕪🕫🕬🕭🕮🕯🕰🕱🕲🕳🕴🕵🕶🕷🕸🕹🕺🕻🕼🕽🕾🕿🖀🖁🖂🖃🖄" \
+"🖅🖆🖇🖈🖉🖊🖋🖌🖍🖎🖏🖐🖑🖒🖓🖔🖕🖖🖗🖘🖙🖚🖛🖜🖝🖞🖟🖠🖡🖢🖣🖤🖥🖦🖧🖨🖩🖪🖫🖬" \
+"🖭🖮🖯🖰🖱🖲🖳🖴🖵🖶🖷🖸🖹🖺🖻🖼🖽🖾🖿🗀🗁🗂🗃🗄🗅🗆🗇🗈🗉🗊🗋🗌🗍🗎🗏🗐🗑🗒🗓🗔" \
+"🗕🗖🗗🗘🗙🗚🗛🗜🗝🗞🗟🗠🗡🗢🗣🗤🗥🗦🗧🗨🗩🗪🗫🗬🗭🗮🗯🗰🗱🗲🗳🗴🗵🗶🗷🗸🗹🗺🗻🗼" \
 "🗽🗾🗿"
 ;
 #endif
 
 // math
 #ifndef _LA_ICO_MATH
-#define _LA_ICO_MATH\
+#define _LA_ICO_MATH \
 "⦁⦿⧫"
 ;
 #endif
 
 // braille
 #ifndef _LA_ICO_BRAILLE
-#define _LA_ICO_BRAILLE\
-"⠀⠁⠂⠃⠄⠅⠆⠇⠈⠉⠊⠋⠌⠍⠎⠏⠐⠑⠒⠓⠔⠕⠖⠗⠘⠙⠚⠛⠜⠝⠞⠟⠠⠡⠢⠣⠤⠥⠦⠧"\
-"⠨⠩⠪⠫⠬⠭⠮⠯⠰⠱⠲⠳⠴⠵⠶⠷⠸⠹⠺⠻⠼⠽⠾⠿⡀⡁⡂⡃⡄⡅⡆⡇⡈⡉⡊⡋⡌⡍⡎⡏"\
-"⡐⡑⡒⡓⡔⡕⡖⡗⡘⡙⡚⡛⡜⡝⡞⡟⡠⡡⡢⡣⡤⡥⡦⡧⡨⡩⡪⡫⡬⡭⡮⡯⡰⡱⡲⡳⡴⡵⡶⡷"\
-"⡸⡹⡺⡻⡼⡽⡾⡿⢀⢁⢂⢃⢄⢅⢆⢇⢈⢉⢊⢋⢌⢍⢎⢏⢐⢑⢒⢓⢔⢕⢖⢗⢘⢙⢚⢛⢜⢝⢞⢟"\
-"⢠⢡⢢⢣⢤⢥⢦⢧⢨⢩⢪⢫⢬⢭⢮⢯⢰⢱⢲⢳⢴⢵⢶⢷⢸⢹⢺⢻⢼⢽⢾⢿⣀⣁⣂⣃⣄⣅⣆⣇"\
-"⣈⣉⣊⣋⣌⣍⣎⣏⣐⣑⣒⣓⣔⣕⣖⣗⣘⣙⣚⣛⣜⣝⣞⣟⣠⣡⣢⣣⣤⣥⣦⣧⣨⣩⣪⣫⣬⣭⣮⣯"\
+#define _LA_ICO_BRAILLE \
+"⠀⠁⠂⠃⠄⠅⠆⠇⠈⠉⠊⠋⠌⠍⠎⠏⠐⠑⠒⠓⠔⠕⠖⠗⠘⠙⠚⠛⠜⠝⠞⠟⠠⠡⠢⠣⠤⠥⠦⠧" \
+"⠨⠩⠪⠫⠬⠭⠮⠯⠰⠱⠲⠳⠴⠵⠶⠷⠸⠹⠺⠻⠼⠽⠾⠿⡀⡁⡂⡃⡄⡅⡆⡇⡈⡉⡊⡋⡌⡍⡎⡏" \
+"⡐⡑⡒⡓⡔⡕⡖⡗⡘⡙⡚⡛⡜⡝⡞⡟⡠⡡⡢⡣⡤⡥⡦⡧⡨⡩⡪⡫⡬⡭⡮⡯⡰⡱⡲⡳⡴⡵⡶⡷" \
+"⡸⡹⡺⡻⡼⡽⡾⡿⢀⢁⢂⢃⢄⢅⢆⢇⢈⢉⢊⢋⢌⢍⢎⢏⢐⢑⢒⢓⢔⢕⢖⢗⢘⢙⢚⢛⢜⢝⢞⢟" \
+"⢠⢡⢢⢣⢤⢥⢦⢧⢨⢩⢪⢫⢬⢭⢮⢯⢰⢱⢲⢳⢴⢵⢶⢷⢸⢹⢺⢻⢼⢽⢾⢿⣀⣁⣂⣃⣄⣅⣆⣇" \
+"⣈⣉⣊⣋⣌⣍⣎⣏⣐⣑⣒⣓⣔⣕⣖⣗⣘⣙⣚⣛⣜⣝⣞⣟⣠⣡⣢⣣⣤⣥⣦⣧⣨⣩⣪⣫⣬⣭⣮⣯" \
 "⣰⣱⣲⣳⣴⣵⣶⣷⣸⣹⣺⣻⣼⣽⣾⣿"
 ;
 #endif
 
 // egyptian
 #ifndef _LA_ICO_EGYPTIAN
-#define _LA_ICO_EGYPTIAN\
-"𓀀𓀁𓀂𓀃𓀄𓀅𓀆𓀇𓀈𓀉𓀊𓀋𓀌𓀍𓀎𓀏𓀐𓀑𓀒𓀓𓀔𓀕𓀖𓀗𓀘𓀙𓀚𓀛𓀜𓀝𓀞𓀟𓀠𓀡𓀢𓀣𓀤𓀥𓀦𓀧"\
-"𓀨𓀩𓀪𓀫𓀬𓀭𓀮𓀯𓀰𓀱𓀲𓀳𓀴𓀵𓀶𓀷𓀸𓀹𓀺𓀻𓀼𓀽𓀾𓀿𓁀𓁁𓁂𓁃𓁄𓁅𓁆𓁇𓁈𓁉𓁊𓁋𓁌𓁍𓁎𓁏"\
-"𓁐𓁑𓁒𓁓𓁔𓁕𓁖𓁗𓁘𓁙𓁚𓁛𓁜𓁝𓁞𓁟𓁠𓁡𓁢𓁣𓁤𓁥𓁦𓁧𓁨𓁩𓁪𓁫𓁬𓁭𓁮𓁯𓁰𓁱𓁲𓁳𓁴𓁵𓁶𓁷"\
-"𓁸𓁹𓁺𓁻𓁼𓁽𓁾𓁿𓂀𓂁𓂂𓂃𓂄𓂅𓂆𓂇𓂈𓂉𓂊𓂋𓂌𓂍𓂎𓂏𓂐𓂑𓂒𓂓𓂔𓂕𓂖𓂗𓂘𓂙𓂚𓂛𓂜𓂝𓂞𓂟"\
-"𓂠𓂡𓂢𓂣𓂤𓂥𓂦𓂧𓂨𓂩𓂪𓂫𓂬𓂭𓂮𓂯𓂰𓂱𓂲𓂳𓂴𓂵𓂶𓂷𓂸𓂹𓂺𓂻𓂼𓂽𓂾𓂿𓃀𓃁𓃂𓃃𓃄𓃅𓃆𓃇"\
-"𓃈𓃉𓃊𓃋𓃌𓃍𓃎𓃏𓃐𓃑𓃒𓃓𓃔𓃕𓃖𓃗𓃘𓃙𓃚𓃛𓃜𓃝𓃞𓃟𓃠𓃡𓃢𓃣𓃤𓃥𓃦𓃧𓃨𓃩𓃪𓃫𓃬𓃭𓃮𓃯"\
-"𓃰𓃱𓃲𓃳𓃴𓃵𓃶𓃷𓃸𓃹𓃺𓃻𓃼𓃽𓃾𓃿𓄀𓄁𓄂𓄃𓄄𓄅𓄆𓄇𓄈𓄉𓄊𓄋𓄌𓄍𓄎𓄏𓄐𓄑𓄒𓄓𓄔𓄕𓄖𓄗"\
-"𓄘𓄙𓄚𓄛𓄜𓄝𓄞𓄟𓄠𓄡𓄢𓄣𓄤𓄥𓄦𓄧𓄨𓄩𓄪𓄫𓄬𓄭𓄮𓄯𓄰𓄱𓄲𓄳𓄴𓄵𓄶𓄷𓄸𓄹𓄺𓄻𓄼𓄽𓄾𓄿"\
-"𓅀𓅁𓅂𓅃𓅄𓅅𓅆𓅇𓅈𓅉𓅊𓅋𓅌𓅍𓅎𓅏𓅐𓅑𓅒𓅓𓅔𓅕𓅖𓅗𓅘𓅙𓅚𓅛𓅜𓅝𓅞𓅟𓅠𓅡𓅢𓅣𓅤𓅥𓅦𓅧"\
-"𓅨𓅩𓅪𓅫𓅬𓅭𓅮𓅯𓅰𓅱𓅲𓅳𓅴𓅵𓅶𓅷𓅸𓅹𓅺𓅻𓅼𓅽𓅾𓅿𓆀𓆁𓆂𓆃𓆄𓆅𓆆𓆇𓆈𓆉𓆊𓆋𓆌𓆍𓆎𓆏"\
-"𓆐𓆑𓆒𓆓𓆔𓆕𓆖𓆗𓆘𓆙𓆚𓆛𓆜𓆝𓆞𓆟𓆠𓆡𓆢𓆣𓆤𓆥𓆦𓆧𓆨𓆩𓆪𓆫𓆬𓆭𓆮𓆯𓆰𓆱𓆲𓆳𓆴𓆵𓆶𓆷"\
-"𓆸𓆹𓆺𓆻𓆼𓆽𓆾𓆿𓇀𓇁𓇂𓇃𓇄𓇅𓇆𓇇𓇈𓇉𓇊𓇋𓇌𓇍𓇎𓇏𓇐𓇑𓇒𓇓𓇔𓇕𓇖𓇗𓇘𓇙𓇚𓇛𓇜𓇝𓇞𓇟"\
-"𓇠𓇡𓇢𓇣𓇤𓇥𓇦𓇧𓇨𓇩𓇪𓇫𓇬𓇭𓇮𓇯𓇰𓇱𓇲𓇳𓇴𓇵𓇶𓇷𓇸𓇹𓇺𓇻𓇼𓇽𓇾𓇿𓈀𓈁𓈂𓈃𓈄𓈅𓈆𓈇"\
-"𓈈𓈉𓈊𓈋𓈌𓈍𓈎𓈏𓈐𓈑𓈒𓈓𓈔𓈕𓈖𓈗𓈘𓈙𓈚𓈛𓈜𓈝𓈞𓈟𓈠𓈡𓈢𓈣𓈤𓈥𓈦𓈧𓈨𓈩𓈪𓈫𓈬𓈭𓈮𓈯"\
-"𓈰𓈱𓈲𓈳𓈴𓈵𓈶𓈷𓈸𓈹𓈺𓈻𓈼𓈽𓈾𓈿𓉀𓉁𓉂𓉃𓉄𓉅𓉆𓉇𓉈𓉉𓉊𓉋𓉌𓉍𓉎𓉏𓉐𓉑𓉒𓉓𓉔𓉕𓉖𓉗"\
-"𓉘𓉙𓉚𓉛𓉜𓉝𓉞𓉟𓉠𓉡𓉢𓉣𓉤𓉥𓉦𓉧𓉨𓉩𓉪𓉫𓉬𓉭𓉮𓉯𓉰𓉱𓉲𓉳𓉴𓉵𓉶𓉷𓉸𓉹𓉺𓉻𓉼𓉽𓉾𓉿"\
-"𓊀𓊁𓊂𓊃𓊄𓊅𓊆𓊇𓊈𓊉𓊊𓊋𓊌𓊍𓊎𓊏𓊐𓊑𓊒𓊓𓊔𓊕𓊖𓊗𓊘𓊙𓊚𓊛𓊜𓊝𓊞𓊟𓊠𓊡𓊢𓊣𓊤𓊥𓊦𓊧"\
-"𓊨𓊩𓊪𓊫𓊬𓊭𓊮𓊯𓊰𓊱𓊲𓊳𓊴𓊵𓊶𓊷𓊸𓊹𓊺𓊻𓊼𓊽𓊾𓊿𓋀𓋁𓋂𓋃𓋄𓋅𓋆𓋇𓋈𓋉𓋊𓋋𓋌𓋍𓋎𓋏"\
-"𓋐𓋑𓋒𓋓𓋔𓋕𓋖𓋗𓋘𓋙𓋚𓋛𓋜𓋝𓋞𓋟𓋠𓋡𓋢𓋣𓋤𓋥𓋦𓋧𓋨𓋩𓋪𓋫𓋬𓋭𓋮𓋯𓋰𓋱𓋲𓋳𓋴𓋵𓋶𓋷"\
-"𓋸𓋹𓋺𓋻𓋼𓋽𓋾𓋿𓌀𓌁𓌂𓌃𓌄𓌅𓌆𓌇𓌈𓌉𓌊𓌋𓌌𓌍𓌎𓌏𓌐𓌑𓌒𓌓𓌔𓌕𓌖𓌗𓌘𓌙𓌚𓌛𓌜𓌝𓌞𓌟"\
-"𓌠𓌡𓌢𓌣𓌤𓌥𓌦𓌧𓌨𓌩𓌪𓌫𓌬𓌭𓌮𓌯𓌰𓌱𓌲𓌳𓌴𓌵𓌶𓌷𓌸𓌹𓌺𓌻𓌼𓌽𓌾𓌿𓍀𓍁𓍂𓍃𓍄𓍅𓍆𓍇"\
-"𓍈𓍉𓍊𓍋𓍌𓍍𓍎𓍏𓍐𓍑𓍒𓍓𓍔𓍕𓍖𓍗𓍘𓍙𓍚𓍛𓍜𓍝𓍞𓍟𓍠𓍡𓍢𓍣𓍤𓍥𓍦𓍧𓍨𓍩𓍪𓍫𓍬𓍭𓍮𓍯"\
-"𓍰𓍱𓍲𓍳𓍴𓍵𓍶𓍷𓍸𓍹𓍺𓍻𓍼𓍽𓍾𓍿𓎀𓎁𓎂𓎃𓎄𓎅𓎆𓎇𓎈𓎉𓎊𓎋𓎌𓎍𓎎𓎏𓎐𓎑𓎒𓎓𓎔𓎕𓎖𓎗"\
-"𓎘𓎙𓎚𓎛𓎜𓎝𓎞𓎟𓎠𓎡𓎢𓎣𓎤𓎥𓎦𓎧𓎨𓎩𓎪𓎫𓎬𓎭𓎮𓎯𓎰𓎱𓎲𓎳𓎴𓎵𓎶𓎷𓎸𓎹𓎺𓎻𓎼𓎽𓎾𓎿"\
-"𓏀𓏁𓏂𓏃𓏄𓏅𓏆𓏇𓏈𓏉𓏊𓏋𓏌𓏍𓏎𓏏𓏐𓏑𓏒𓏓𓏔𓏕𓏖𓏗𓏘𓏙𓏚𓏛𓏜𓏝𓏞𓏟𓏠𓏡𓏢𓏣𓏤𓏥𓏦𓏧"\
-"𓏨𓏩𓏪𓏫𓏬𓏭𓏮𓏯𓏰𓏱𓏲𓏳𓏴𓏵𓏶𓏷𓏸𓏹𓏺𓏻𓏼𓏽𓏾𓏿𓐀𓐁𓐂𓐃𓐄𓐅𓐆𓐇𓐈𓐉𓐊𓐋𓐌𓐍𓐎𓐏"\
+#define _LA_ICO_EGYPTIAN \
+"𓀀𓀁𓀂𓀃𓀄𓀅𓀆𓀇𓀈𓀉𓀊𓀋𓀌𓀍𓀎𓀏𓀐𓀑𓀒𓀓𓀔𓀕𓀖𓀗𓀘𓀙𓀚𓀛𓀜𓀝𓀞𓀟𓀠𓀡𓀢𓀣𓀤𓀥𓀦𓀧" \
+"𓀨𓀩𓀪𓀫𓀬𓀭𓀮𓀯𓀰𓀱𓀲𓀳𓀴𓀵𓀶𓀷𓀸𓀹𓀺𓀻𓀼𓀽𓀾𓀿𓁀𓁁𓁂𓁃𓁄𓁅𓁆𓁇𓁈𓁉𓁊𓁋𓁌𓁍𓁎𓁏" \
+"𓁐𓁑𓁒𓁓𓁔𓁕𓁖𓁗𓁘𓁙𓁚𓁛𓁜𓁝𓁞𓁟𓁠𓁡𓁢𓁣𓁤𓁥𓁦𓁧𓁨𓁩𓁪𓁫𓁬𓁭𓁮𓁯𓁰𓁱𓁲𓁳𓁴𓁵𓁶𓁷" \
+"𓁸𓁹𓁺𓁻𓁼𓁽𓁾𓁿𓂀𓂁𓂂𓂃𓂄𓂅𓂆𓂇𓂈𓂉𓂊𓂋𓂌𓂍𓂎𓂏𓂐𓂑𓂒𓂓𓂔𓂕𓂖𓂗𓂘𓂙𓂚𓂛𓂜𓂝𓂞𓂟" \
+"𓂠𓂡𓂢𓂣𓂤𓂥𓂦𓂧𓂨𓂩𓂪𓂫𓂬𓂭𓂮𓂯𓂰𓂱𓂲𓂳𓂴𓂵𓂶𓂷𓂸𓂹𓂺𓂻𓂼𓂽𓂾𓂿𓃀𓃁𓃂𓃃𓃄𓃅𓃆𓃇" \
+"𓃈𓃉𓃊𓃋𓃌𓃍𓃎𓃏𓃐𓃑𓃒𓃓𓃔𓃕𓃖𓃗𓃘𓃙𓃚𓃛𓃜𓃝𓃞𓃟𓃠𓃡𓃢𓃣𓃤𓃥𓃦𓃧𓃨𓃩𓃪𓃫𓃬𓃭𓃮𓃯" \
+"𓃰𓃱𓃲𓃳𓃴𓃵𓃶𓃷𓃸𓃹𓃺𓃻𓃼𓃽𓃾𓃿𓄀𓄁𓄂𓄃𓄄𓄅𓄆𓄇𓄈𓄉𓄊𓄋𓄌𓄍𓄎𓄏𓄐𓄑𓄒𓄓𓄔𓄕𓄖𓄗" \
+"𓄘𓄙𓄚𓄛𓄜𓄝𓄞𓄟𓄠𓄡𓄢𓄣𓄤𓄥𓄦𓄧𓄨𓄩𓄪𓄫𓄬𓄭𓄮𓄯𓄰𓄱𓄲𓄳𓄴𓄵𓄶𓄷𓄸𓄹𓄺𓄻𓄼𓄽𓄾𓄿" \
+"𓅀𓅁𓅂𓅃𓅄𓅅𓅆𓅇𓅈𓅉𓅊𓅋𓅌𓅍𓅎𓅏𓅐𓅑𓅒𓅓𓅔𓅕𓅖𓅗𓅘𓅙𓅚𓅛𓅜𓅝𓅞𓅟𓅠𓅡𓅢𓅣𓅤𓅥𓅦𓅧" \
+"𓅨𓅩𓅪𓅫𓅬𓅭𓅮𓅯𓅰𓅱𓅲𓅳𓅴𓅵𓅶𓅷𓅸𓅹𓅺𓅻𓅼𓅽𓅾𓅿𓆀𓆁𓆂𓆃𓆄𓆅𓆆𓆇𓆈𓆉𓆊𓆋𓆌𓆍𓆎𓆏" \
+"𓆐𓆑𓆒𓆓𓆔𓆕𓆖𓆗𓆘𓆙𓆚𓆛𓆜𓆝𓆞𓆟𓆠𓆡𓆢𓆣𓆤𓆥𓆦𓆧𓆨𓆩𓆪𓆫𓆬𓆭𓆮𓆯𓆰𓆱𓆲𓆳𓆴𓆵𓆶𓆷" \
+"𓆸𓆹𓆺𓆻𓆼𓆽𓆾𓆿𓇀𓇁𓇂𓇃𓇄𓇅𓇆𓇇𓇈𓇉𓇊𓇋𓇌𓇍𓇎𓇏𓇐𓇑𓇒𓇓𓇔𓇕𓇖𓇗𓇘𓇙𓇚𓇛𓇜𓇝𓇞𓇟" \
+"𓇠𓇡𓇢𓇣𓇤𓇥𓇦𓇧𓇨𓇩𓇪𓇫𓇬𓇭𓇮𓇯𓇰𓇱𓇲𓇳𓇴𓇵𓇶𓇷𓇸𓇹𓇺𓇻𓇼𓇽𓇾𓇿𓈀𓈁𓈂𓈃𓈄𓈅𓈆𓈇" \
+"𓈈𓈉𓈊𓈋𓈌𓈍𓈎𓈏𓈐𓈑𓈒𓈓𓈔𓈕𓈖𓈗𓈘𓈙𓈚𓈛𓈜𓈝𓈞𓈟𓈠𓈡𓈢𓈣𓈤𓈥𓈦𓈧𓈨𓈩𓈪𓈫𓈬𓈭𓈮𓈯" \
+"𓈰𓈱𓈲𓈳𓈴𓈵𓈶𓈷𓈸𓈹𓈺𓈻𓈼𓈽𓈾𓈿𓉀𓉁𓉂𓉃𓉄𓉅𓉆𓉇𓉈𓉉𓉊𓉋𓉌𓉍𓉎𓉏𓉐𓉑𓉒𓉓𓉔𓉕𓉖𓉗" \
+"𓉘𓉙𓉚𓉛𓉜𓉝𓉞𓉟𓉠𓉡𓉢𓉣𓉤𓉥𓉦𓉧𓉨𓉩𓉪𓉫𓉬𓉭𓉮𓉯𓉰𓉱𓉲𓉳𓉴𓉵𓉶𓉷𓉸𓉹𓉺𓉻𓉼𓉽𓉾𓉿" \
+"𓊀𓊁𓊂𓊃𓊄𓊅𓊆𓊇𓊈𓊉𓊊𓊋𓊌𓊍𓊎𓊏𓊐𓊑𓊒𓊓𓊔𓊕𓊖𓊗𓊘𓊙𓊚𓊛𓊜𓊝𓊞𓊟𓊠𓊡𓊢𓊣𓊤𓊥𓊦𓊧" \
+"𓊨𓊩𓊪𓊫𓊬𓊭𓊮𓊯𓊰𓊱𓊲𓊳𓊴𓊵𓊶𓊷𓊸𓊹𓊺𓊻𓊼𓊽𓊾𓊿𓋀𓋁𓋂𓋃𓋄𓋅𓋆𓋇𓋈𓋉𓋊𓋋𓋌𓋍𓋎𓋏" \
+"𓋐𓋑𓋒𓋓𓋔𓋕𓋖𓋗𓋘𓋙𓋚𓋛𓋜𓋝𓋞𓋟𓋠𓋡𓋢𓋣𓋤𓋥𓋦𓋧𓋨𓋩𓋪𓋫𓋬𓋭𓋮𓋯𓋰𓋱𓋲𓋳𓋴𓋵𓋶𓋷" \
+"𓋸𓋹𓋺𓋻𓋼𓋽𓋾𓋿𓌀𓌁𓌂𓌃𓌄𓌅𓌆𓌇𓌈𓌉𓌊𓌋𓌌𓌍𓌎𓌏𓌐𓌑𓌒𓌓𓌔𓌕𓌖𓌗𓌘𓌙𓌚𓌛𓌜𓌝𓌞𓌟" \
+"𓌠𓌡𓌢𓌣𓌤𓌥𓌦𓌧𓌨𓌩𓌪𓌫𓌬𓌭𓌮𓌯𓌰𓌱𓌲𓌳𓌴𓌵𓌶𓌷𓌸𓌹𓌺𓌻𓌼𓌽𓌾𓌿𓍀𓍁𓍂𓍃𓍄𓍅𓍆𓍇" \
+"𓍈𓍉𓍊𓍋𓍌𓍍𓍎𓍏𓍐𓍑𓍒𓍓𓍔𓍕𓍖𓍗𓍘𓍙𓍚𓍛𓍜𓍝𓍞𓍟𓍠𓍡𓍢𓍣𓍤𓍥𓍦𓍧𓍨𓍩𓍪𓍫𓍬𓍭𓍮𓍯" \
+"𓍰𓍱𓍲𓍳𓍴𓍵𓍶𓍷𓍸𓍹𓍺𓍻𓍼𓍽𓍾𓍿𓎀𓎁𓎂𓎃𓎄𓎅𓎆𓎇𓎈𓎉𓎊𓎋𓎌𓎍𓎎𓎏𓎐𓎑𓎒𓎓𓎔𓎕𓎖𓎗" \
+"𓎘𓎙𓎚𓎛𓎜𓎝𓎞𓎟𓎠𓎡𓎢𓎣𓎤𓎥𓎦𓎧𓎨𓎩𓎪𓎫𓎬𓎭𓎮𓎯𓎰𓎱𓎲𓎳𓎴𓎵𓎶𓎷𓎸𓎹𓎺𓎻𓎼𓎽𓎾𓎿" \
+"𓏀𓏁𓏂𓏃𓏄𓏅𓏆𓏇𓏈𓏉𓏊𓏋𓏌𓏍𓏎𓏏𓏐𓏑𓏒𓏓𓏔𓏕𓏖𓏗𓏘𓏙𓏚𓏛𓏜𓏝𓏞𓏟𓏠𓏡𓏢𓏣𓏤𓏥𓏦𓏧" \
+"𓏨𓏩𓏪𓏫𓏬𓏭𓏮𓏯𓏰𓏱𓏲𓏳𓏴𓏵𓏶𓏷𓏸𓏹𓏺𓏻𓏼𓏽𓏾𓏿𓐀𓐁𓐂𓐃𓐄𓐅𓐆𓐇𓐈𓐉𓐊𓐋𓐌𓐍𓐎𓐏" \
 "𓐐𓐑𓐒𓐓𓐔𓐕𓐖𓐗𓐘𓐙𓐚𓐛𓐜𓐝𓐞𓐟𓐠𓐡𓐢𓐣𓐤𓐥𓐦𓐧𓐨𓐩𓐪𓐫𓐬𓐭𓐮"
 ;
 #endif
 
 // musical
 #ifndef _LA_ICO_MUSICAL
-#define _LA_ICO_MUSICAL\
-"𝀀𝀁𝀂𝀃𝀄𝀅𝀆𝀇𝀈𝀉𝀊𝀋𝀌𝀍𝀎𝀏𝀐𝀑𝀒𝀓𝀔𝀕𝀖𝀗𝀘𝀙𝀚𝀛𝀜𝀝𝀞𝀟𝀠𝀡𝀢𝀣𝀤𝀥𝀦𝀧"\
-"𝀨𝀩𝀪𝀫𝀬𝀭𝀮𝀯𝀰𝀱𝀲𝀳𝀴𝀵𝀶𝀷𝀸𝀹𝀺𝀻𝀼𝀽𝀾𝀿𝁀𝁁𝁂𝁃𝁄𝁅𝁆𝁇𝁈𝁉𝁊𝁋𝁌𝁍𝁎𝁏"\
-"𝁐𝁑𝁒𝁓𝁔𝁕𝁖𝁗𝁘𝁙𝁚𝁛𝁜𝁝𝁞𝁟𝁠𝁡𝁢𝁣𝁤𝁥𝁦𝁧𝁨𝁩𝁪𝁫𝁬𝁭𝁮𝁯𝁰𝁱𝁲𝁳𝁴𝁵𝁶𝁷"\
-"𝁸𝁹𝁺𝁻𝁼𝁽𝁾𝁿𝂀𝂁𝂂𝂃𝂄𝂅𝂆𝂇𝂈𝂉𝂊𝂋𝂌𝂍𝂎𝂏𝂐𝂑𝂒𝂓𝂔𝂕𝂖𝂗𝂘𝂙𝂚𝂛𝂜𝂝𝂞𝂟"\
-"𝂠𝂡𝂢𝂣𝂤𝂥𝂦𝂧𝂨𝂩𝂪𝂫𝂬𝂭𝂮𝂯𝂰𝂱𝂲𝂳𝂴𝂵𝂶𝂷𝂸𝂹𝂺𝂻𝂼𝂽𝂾𝂿𝃀𝃁𝃂𝃃𝃄𝃅𝃆𝃇"\
-"𝃈𝃉𝃊𝃋𝃌𝃍𝃎𝃏𝃐𝃑𝃒𝃓𝃔𝃕𝃖𝃗𝃘𝃙𝃚𝃛𝃜𝃝𝃞𝃟𝃠𝃡𝃢𝃣𝃤𝃥𝃦𝃧𝃨𝃩𝃪𝃫𝃬𝃭𝃮𝃯"\
-"𝃰𝃱𝃲𝃳𝃴𝃵𝄀𝄁𝄂𝄃𝄄𝄅𝄆𝄇𝄈𝄉𝄊𝄋𝄌𝄍𝄎𝄏𝄐𝄑𝄒𝄓𝄔𝄕𝄖𝄗𝄘𝄙𝄚𝄛𝄜𝄝𝄞𝄟𝄠𝄡"\
-"𝄢𝄣𝄤𝄥𝄦𝄩𝄪𝄫𝄬𝄭𝄮𝄯𝄰𝄱𝄲𝄳𝄴𝄵𝄶𝄷𝄸𝄹𝄺𝄻𝄼𝄽𝄾𝄿𝅀𝅁𝅂𝅃𝅄𝅅𝅆𝅇𝅈𝅉𝅊𝅋"\
-"𝅌𝅍𝅎𝅏𝅐𝅑𝅒𝅓𝅔𝅕𝅖𝅗𝅘𝅙𝅚𝅛𝅜𝅝𝅗𝅥𝅘𝅥𝅘𝅥𝅮𝅘𝅥𝅯𝅘𝅥𝅰𝅘𝅥𝅱𝅘𝅧𝅨𝅩𝅥𝅲𝅥𝅦𝅪𝅫𝅬𝅮𝅯𝅰𝅱𝅲𝅭𝅳"\
-"𝅴𝅵𝅶𝅷𝅸𝅹𝅺𝅻𝅼𝅽𝅾𝅿𝆀𝆁𝆂𝆃𝆄𝆊𝆋𝆅𝆆𝆇𝆈𝆉𝆌𝆍𝆎𝆏𝆐𝆑𝆒𝆓𝆔𝆕𝆖𝆗𝆘𝆙𝆚𝆛"\
-"𝆜𝆝𝆞𝆟𝆠𝆡𝆢𝆣𝆤𝆥𝆦𝆧𝆨𝆩𝆪𝆫𝆬𝆭𝆮𝆯𝆰𝆱𝆲𝆳𝆴𝆵𝆶𝆷𝆸𝆹𝆺𝆹𝅥𝆺𝅥𝆹𝅥𝅮𝆺𝅥𝅮𝆹𝅥𝅯𝆺𝅥𝅯𝇁𝇂𝇃"\
-"𝇄𝇅𝇆𝇇𝇈𝇉𝇊𝇋𝇌𝇍𝇎𝇏𝇐𝇑𝇒𝇓𝇔𝇕𝇖𝇗𝇘𝇙𝇚𝇛𝇜𝇝𝇞𝇟𝇠𝇡𝇢𝇣𝇤𝇥𝇦𝇧𝇨𝈀𝈁𝈂"\
-"𝈃𝈄𝈅𝈆𝈇𝈈𝈉𝈊𝈋𝈌𝈍𝈎𝈏𝈐𝈑𝈒𝈓𝈔𝈕𝈖𝈗𝈘𝈙𝈚𝈛𝈜𝈝𝈞𝈟𝈠𝈡𝈢𝈣𝈤𝈥𝈦𝈧𝈨𝈩𝈪"\
+#define _LA_ICO_MUSICAL \
+"𝀀𝀁𝀂𝀃𝀄𝀅𝀆𝀇𝀈𝀉𝀊𝀋𝀌𝀍𝀎𝀏𝀐𝀑𝀒𝀓𝀔𝀕𝀖𝀗𝀘𝀙𝀚𝀛𝀜𝀝𝀞𝀟𝀠𝀡𝀢𝀣𝀤𝀥𝀦𝀧" \
+"𝀨𝀩𝀪𝀫𝀬𝀭𝀮𝀯𝀰𝀱𝀲𝀳𝀴𝀵𝀶𝀷𝀸𝀹𝀺𝀻𝀼𝀽𝀾𝀿𝁀𝁁𝁂𝁃𝁄𝁅𝁆𝁇𝁈𝁉𝁊𝁋𝁌𝁍𝁎𝁏" \
+"𝁐𝁑𝁒𝁓𝁔𝁕𝁖𝁗𝁘𝁙𝁚𝁛𝁜𝁝𝁞𝁟𝁠𝁡𝁢𝁣𝁤𝁥𝁦𝁧𝁨𝁩𝁪𝁫𝁬𝁭𝁮𝁯𝁰𝁱𝁲𝁳𝁴𝁵𝁶𝁷" \
+"𝁸𝁹𝁺𝁻𝁼𝁽𝁾𝁿𝂀𝂁𝂂𝂃𝂄𝂅𝂆𝂇𝂈𝂉𝂊𝂋𝂌𝂍𝂎𝂏𝂐𝂑𝂒𝂓𝂔𝂕𝂖𝂗𝂘𝂙𝂚𝂛𝂜𝂝𝂞𝂟" \
+"𝂠𝂡𝂢𝂣𝂤𝂥𝂦𝂧𝂨𝂩𝂪𝂫𝂬𝂭𝂮𝂯𝂰𝂱𝂲𝂳𝂴𝂵𝂶𝂷𝂸𝂹𝂺𝂻𝂼𝂽𝂾𝂿𝃀𝃁𝃂𝃃𝃄𝃅𝃆𝃇" \
+"𝃈𝃉𝃊𝃋𝃌𝃍𝃎𝃏𝃐𝃑𝃒𝃓𝃔𝃕𝃖𝃗𝃘𝃙𝃚𝃛𝃜𝃝𝃞𝃟𝃠𝃡𝃢𝃣𝃤𝃥𝃦𝃧𝃨𝃩𝃪𝃫𝃬𝃭𝃮𝃯" \
+"𝃰𝃱𝃲𝃳𝃴𝃵𝄀𝄁𝄂𝄃𝄄𝄅𝄆𝄇𝄈𝄉𝄊𝄋𝄌𝄍𝄎𝄏𝄐𝄑𝄒𝄓𝄔𝄕𝄖𝄗𝄘𝄙𝄚𝄛𝄜𝄝𝄞𝄟𝄠𝄡" \
+"𝄢𝄣𝄤𝄥𝄦𝄩𝄪𝄫𝄬𝄭𝄮𝄯𝄰𝄱𝄲𝄳𝄴𝄵𝄶𝄷𝄸𝄹𝄺𝄻𝄼𝄽𝄾𝄿𝅀𝅁𝅂𝅃𝅄𝅅𝅆𝅇𝅈𝅉𝅊𝅋" \
+"𝅌𝅍𝅎𝅏𝅐𝅑𝅒𝅓𝅔𝅕𝅖𝅗𝅘𝅙𝅚𝅛𝅜𝅝𝅗𝅥𝅘𝅥𝅘𝅥𝅮𝅘𝅥𝅯𝅘𝅥𝅰𝅘𝅥𝅱𝅘𝅧𝅨𝅩𝅥𝅲𝅥𝅦𝅪𝅫𝅬𝅮𝅯𝅰𝅱𝅲𝅭𝅳" \
+"𝅴𝅵𝅶𝅷𝅸𝅹𝅺𝅻𝅼𝅽𝅾𝅿𝆀𝆁𝆂𝆃𝆄𝆊𝆋𝆅𝆆𝆇𝆈𝆉𝆌𝆍𝆎𝆏𝆐𝆑𝆒𝆓𝆔𝆕𝆖𝆗𝆘𝆙𝆚𝆛" \
+"𝆜𝆝𝆞𝆟𝆠𝆡𝆢𝆣𝆤𝆥𝆦𝆧𝆨𝆩𝆪𝆫𝆬𝆭𝆮𝆯𝆰𝆱𝆲𝆳𝆴𝆵𝆶𝆷𝆸𝆹𝆺𝆹𝅥𝆺𝅥𝆹𝅥𝅮𝆺𝅥𝅮𝆹𝅥𝅯𝆺𝅥𝅯𝇁𝇂𝇃" \
+"𝇄𝇅𝇆𝇇𝇈𝇉𝇊𝇋𝇌𝇍𝇎𝇏𝇐𝇑𝇒𝇓𝇔𝇕𝇖𝇗𝇘𝇙𝇚𝇛𝇜𝇝𝇞𝇟𝇠𝇡𝇢𝇣𝇤𝇥𝇦𝇧𝇨𝈀𝈁𝈂" \
+"𝈃𝈄𝈅𝈆𝈇𝈈𝈉𝈊𝈋𝈌𝈍𝈎𝈏𝈐𝈑𝈒𝈓𝈔𝈕𝈖𝈗𝈘𝈙𝈚𝈛𝈜𝈝𝈞𝈟𝈠𝈡𝈢𝈣𝈤𝈥𝈦𝈧𝈨𝈩𝈪" \
 "𝈫𝈬𝈭𝈮𝈯𝈰𝈱𝈲𝈳𝈴𝈵𝈶𝈷𝈸𝈹𝈺𝈻𝈼𝈽𝈾𝈿𝉀𝉁𝉂𝉃𝉄𝉅"
 ;
 #endif
 
 // mayan_num
 #ifndef _LA_ICO_MAYAN_NUM
-#define _LA_ICO_MAYAN_NUM\
+#define _LA_ICO_MAYAN_NUM \
 "𝋠𝋡𝋢𝋣𝋤𝋥𝋦𝋧𝋨𝋩𝋪𝋫𝋬𝋭𝋮𝋯𝋰𝋱𝋲𝋳"
 ;
 #endif
 
 // taixuan
 #ifndef _LA_ICO_TAIXUAN
-#define _LA_ICO_TAIXUAN\
-"𝌀𝌁𝌂𝌃𝌄𝌅𝌆𝌇𝌈𝌉𝌊𝌋𝌌𝌍𝌎𝌏𝌐𝌑𝌒𝌓𝌔𝌕𝌖𝌗𝌘𝌙𝌚𝌛𝌜𝌝𝌞𝌟𝌠𝌡𝌢𝌣𝌤𝌥𝌦𝌧"\
-"𝌨𝌩𝌪𝌫𝌬𝌭𝌮𝌯𝌰𝌱𝌲𝌳𝌴𝌵𝌶𝌷𝌸𝌹𝌺𝌻𝌼𝌽𝌾𝌿𝍀𝍁𝍂𝍃𝍄𝍅𝍆𝍇𝍈𝍉𝍊𝍋𝍌𝍍𝍎𝍏"\
+#define _LA_ICO_TAIXUAN \
+"𝌀𝌁𝌂𝌃𝌄𝌅𝌆𝌇𝌈𝌉𝌊𝌋𝌌𝌍𝌎𝌏𝌐𝌑𝌒𝌓𝌔𝌕𝌖𝌗𝌘𝌙𝌚𝌛𝌜𝌝𝌞𝌟𝌠𝌡𝌢𝌣𝌤𝌥𝌦𝌧" \
+"𝌨𝌩𝌪𝌫𝌬𝌭𝌮𝌯𝌰𝌱𝌲𝌳𝌴𝌵𝌶𝌷𝌸𝌹𝌺𝌻𝌼𝌽𝌾𝌿𝍀𝍁𝍂𝍃𝍄𝍅𝍆𝍇𝍈𝍉𝍊𝍋𝍌𝍍𝍎𝍏" \
 "𝍐𝍑𝍒𝍓𝍔𝍕𝍖"
 ;
 #endif
 
 // rod
 #ifndef _LA_ICO_ROD
-#define _LA_ICO_ROD\
+#define _LA_ICO_ROD \
 "𝍠𝍡𝍢𝍣𝍤𝍥𝍦𝍧𝍨𝍩𝍪𝍫𝍬𝍭𝍮𝍯𝍰𝍱𝍲𝍳𝍴𝍵𝍶𝍷𝍸"
 ;
 #endif
 
 // enclosed
 #ifndef _LA_ICO_ENCLOSED
-#define _LA_ICO_ENCLOSED\
-"🄀🄁🄂🄃🄄🄅🄆🄇🄈🄉🄊🄋🄌🄐🄑🄒🄓🄔🄕🄖🄗🄘🄙🄚🄛🄜🄝🄞🄟🄠🄡🄢🄣🄤🄥🄦🄧🄨🄩🄪"\
-"🄫🄬🄭🄮🄯🄰🄱🄲🄳🄴🄵🄶🄷🄸🄹🄺🄻🄼🄽🄾🄿🅀🅁🅂🅃🅄🅅🅆🅇🅈🅉🅊🅋🅌🅍🅎🅏🅐🅑🅒"\
-"🅓🅔🅕🅖🅗🅘🅙🅚🅛🅜🅝🅞🅟🅠🅡🅢🅣🅤🅥🅦🅧🅨🅩🅪🅫🅬🅰🅱🅲🅳🅴🅵🅶🅷🅸🅹🅺🅻🅼🅽"\
-"🅾🅿🆀🆁🆂🆃🆄🆅🆆🆇🆈🆉🆊🆋🆌🆍🆎🆏🆐🆑🆒🆓🆔🆕🆖🆗🆘🆙🆚🆛🆜🆝🆞🆟🆠🆡🆢🆣🆤🆥"\
-"🆦🆧🆨🆩🆪🆫🆬🇦🇧🇨🇩🇪🇫🇬🇭🇮🇯🇰🇱🇲🇳🇴🇵🇶🇷🇸🇹🇺🇻🇼🇽🇾🇿🈁🈂🈚🈯🈲🈳🈴"\
+#define _LA_ICO_ENCLOSED \
+"🄀🄁🄂🄃🄄🄅🄆🄇🄈🄉🄊🄋🄌🄐🄑🄒🄓🄔🄕🄖🄗🄘🄙🄚🄛🄜🄝🄞🄟🄠🄡🄢🄣🄤🄥🄦🄧🄨🄩🄪" \
+"🄫🄬🄭🄮🄯🄰🄱🄲🄳🄴🄵🄶🄷🄸🄹🄺🄻🄼🄽🄾🄿🅀🅁🅂🅃🅄🅅🅆🅇🅈🅉🅊🅋🅌🅍🅎🅏🅐🅑🅒" \
+"🅓🅔🅕🅖🅗🅘🅙🅚🅛🅜🅝🅞🅟🅠🅡🅢🅣🅤🅥🅦🅧🅨🅩🅪🅫🅬🅰🅱🅲🅳🅴🅵🅶🅷🅸🅹🅺🅻🅼🅽" \
+"🅾🅿🆀🆁🆂🆃🆄🆅🆆🆇🆈🆉🆊🆋🆌🆍🆎🆏🆐🆑🆒🆓🆔🆕🆖🆗🆘🆙🆚🆛🆜🆝🆞🆟🆠🆡🆢🆣🆤🆥" \
+"🆦🆧🆨🆩🆪🆫🆬🇦🇧🇨🇩🇪🇫🇬🇭🇮🇯🇰🇱🇲🇳🇴🇵🇶🇷🇸🇹🇺🇻🇼🇽🇾🇿🈁🈂🈚🈯🈲🈳🈴" \
 "🈵🈶🈷🈸🈹🈺🉐🉑"
 ;
 #endif
 
 // emo
 #ifndef _LA_ICO_EMO
-#define _LA_ICO_EMO\
-"😀😁😂😃😄😅😆😇😈😉😊😋😌😍😎😏😐😑😒😓😔😕😖😗😘😙😚😛😜😝😞😟😠😡😢😣😤😥😦😧"\
+#define _LA_ICO_EMO \
+"😀😁😂😃😄😅😆😇😈😉😊😋😌😍😎😏😐😑😒😓😔😕😖😗😘😙😚😛😜😝😞😟😠😡😢😣😤😥😦😧" \
 "😨😩😪😫😬😭😮😯😰😱😲😳😴😵😶😷😸😹😺😻😼😽😾😿🙀🙁🙂🙃🙄🙅🙆🙇🙈🙉🙊🙋🙌🙍🙎🙏"
 #endif
 
 // transport
 #ifndef _LA_ICO_TRANSPORT
-#define _LA_ICO_TRANSPORT\
-"🚀🚁🚂🚃🚄🚅🚆🚇🚈🚉🚊🚋🚌🚍🚎🚏🚐🚑🚒🚓🚔🚕🚖🚗🚘🚙🚚🚛🚜🚝🚞🚟🚠🚡🚢🚣🚤🚥🚦🚧"\
-"🚨🚩🚪🚫🚬🚭🚮🚯🚰🚱🚲🚳🚴🚵🚶🚷🚸🚹🚺🚻🚼🚽🚾🚿🛀🛁🛂🛃🛄🛅🛆🛇🛈🛉🛊🛋🛌🛍🛎🛏"\
+#define _LA_ICO_TRANSPORT \
+"🚀🚁🚂🚃🚄🚅🚆🚇🚈🚉🚊🚋🚌🚍🚎🚏🚐🚑🚒🚓🚔🚕🚖🚗🚘🚙🚚🚛🚜🚝🚞🚟🚠🚡🚢🚣🚤🚥🚦🚧" \
+"🚨🚩🚪🚫🚬🚭🚮🚯🚰🚱🚲🚳🚴🚵🚶🚷🚸🚹🚺🚻🚼🚽🚾🚿🛀🛁🛂🛃🛄🛅🛆🛇🛈🛉🛊🛋🛌🛍🛎🛏" \
 "🛐🛑🛒🛓🛔🛕🛖🛗🛝🛞🛟🛠🛡🛢🛣🛤🛥🛦🛧🛨🛩🛪🛫🛬🛰🛱🛲🛳🛴🛵🛶🛷🛸🛹🛺🛻🛼"
 ;
 #endif
 
 // alchemical
 #ifndef _LA_ICO_ALCHEMICAL
-#define _LA_ICO_ALCHEMICAL\
-"🜀🜁🜂🜃🜄🜅🜆🜇🜈🜉🜊🜋🜌🜍🜎🜏🜐🜑🜒🜓🜔🜕🜖🜗🜘🜙🜚🜛🜜🜝🜞🜟🜠🜡🜢🜣🜤🜥🜦🜧"\
-"🜨🜩🜪🜫🜬🜭🜮🜯🜰🜱🜲🜳🜴🜵🜶🜷🜸🜹🜺🜻🜼🜽🜾🜿🝀🝁🝂🝃🝄🝅🝆🝇🝈🝉🝊🝋🝌🝍🝎🝏"\
+#define _LA_ICO_ALCHEMICAL \
+"🜀🜁🜂🜃🜄🜅🜆🜇🜈🜉🜊🜋🜌🜍🜎🜏🜐🜑🜒🜓🜔🜕🜖🜗🜘🜙🜚🜛🜜🜝🜞🜟🜠🜡🜢🜣🜤🜥🜦🜧" \
+"🜨🜩🜪🜫🜬🜭🜮🜯🜰🜱🜲🜳🜴🜵🜶🜷🜸🜹🜺🜻🜼🜽🜾🜿🝀🝁🝂🝃🝄🝅🝆🝇🝈🝉🝊🝋🝌🝍🝎🝏" \
 "🝐🝑🝒🝓🝔🝕🝖🝗🝘🝙🝚🝛🝜🝝🝞🝟🝠🝡🝢🝣🝤🝥🝦🝧🝨🝩🝪🝫🝬🝭🝮🝯🝰🝱🝲🝳"
 ;
 #endif
 
 // pic
 #ifndef _LA_ICO_PIC
-#define _LA_ICO_PIC\
-"🤌🤍🤎🤏🤐🤑🤒🤓🤔🤕🤖🤗🤘🤙🤚🤛🤜🤝🤞🤟🤠🤡🤢🤣🤤🤥🤦🤧🤨🤩🤪🤫🤬🤭🤮🤯🤰🤱🤲🤳"\
-"🤴🤵🤶🤷🤸🤹🤺🤻🤼🤽🤾🤿🥀🥁🥂🥃🥄🥅🥆🥇🥈🥉🥊🥋🥌🥍🥎🥏🥐🥑🥒🥓🥔🥕🥖🥗🥘🥙🥚🥛"\
-"🥜🥝🥞🥟🥠🥡🥢🥣🥤🥥🥦🥧🥨🥩🥪🥫🥬🥭🥮🥯🥰🥱🥲🥳🥴🥵🥶🥷🥸🥹🥺🥻🥼🥽🥾🥿🦀🦁🦂🦃"\
-"🦄🦅🦆🦇🦈🦉🦊🦋🦌🦍🦎🦏🦐🦑🦒🦓🦔🦕🦖🦗🦘🦙🦚🦛🦜🦝🦞🦟🦠🦡🦢🦣🦤🦥🦦🦧🦨🦩🦪🦫"\
-"🦬🦭🦮🦯🦰🦱🦲🦳🦴🦵🦶🦷🦸🦹🦺🦻🦼🦽🦾🦿🧀🧁🧂🧃🧄🧅🧆🧇🧈🧉🧊🧋🧌🧍🧎🧏🧐🧑🧒🧓"\
-"🧔🧕🧖🧗🧘🧙🧚🧛🧜🧝🧞🧟🧠🧡🧢🧣🧤🧥🧦🧧🧨🧩🧪🧫🧬🧭🧮🧯🧰🧱🧲🧳🧴🧵🧶🧷🧸🧹🧺🧻"\
-"🧼🧽🧾🧿🩰🩱🩲🩳🩴🩸🩹🩺🩻🩼🪀🪁🪂🪃🪄🪅🪆🪐🪑🪒🪓🪔🪕🪖🪗🪘🪙🪚🪛🪜🪝🪞🪟🪠🪡🪢"\
-"🪣🪤🪥🪦🪧🪨🪩🪪🪫🪬🪰🪱🪲🪳🪴🪵🪶🪷🪸🪹🪺🫀🫁🫂🫃🫄🫅🫐🫑🫒🫓🫔🫕🫖🫗🫘🫙🫠🫡🫢"\
+#define _LA_ICO_PIC \
+"🤌🤍🤎🤏🤐🤑🤒🤓🤔🤕🤖🤗🤘🤙🤚🤛🤜🤝🤞🤟🤠🤡🤢🤣🤤🤥🤦🤧🤨🤩🤪🤫🤬🤭🤮🤯🤰🤱🤲🤳" \
+"🤴🤵🤶🤷🤸🤹🤺🤻🤼🤽🤾🤿🥀🥁🥂🥃🥄🥅🥆🥇🥈🥉🥊🥋🥌🥍🥎🥏🥐🥑🥒🥓🥔🥕🥖🥗🥘🥙🥚🥛" \
+"🥜🥝🥞🥟🥠🥡🥢🥣🥤🥥🥦🥧🥨🥩🥪🥫🥬🥭🥮🥯🥰🥱🥲🥳🥴🥵🥶🥷🥸🥹🥺🥻🥼🥽🥾🥿🦀🦁🦂🦃" \
+"🦄🦅🦆🦇🦈🦉🦊🦋🦌🦍🦎🦏🦐🦑🦒🦓🦔🦕🦖🦗🦘🦙🦚🦛🦜🦝🦞🦟🦠🦡🦢🦣🦤🦥🦦🦧🦨🦩🦪🦫" \
+"🦬🦭🦮🦯🦰🦱🦲🦳🦴🦵🦶🦷🦸🦹🦺🦻🦼🦽🦾🦿🧀🧁🧂🧃🧄🧅🧆🧇🧈🧉🧊🧋🧌🧍🧎🧏🧐🧑🧒🧓" \
+"🧔🧕🧖🧗🧘🧙🧚🧛🧜🧝🧞🧟🧠🧡🧢🧣🧤🧥🧦🧧🧨🧩🧪🧫🧬🧭🧮🧯🧰🧱🧲🧳🧴🧵🧶🧷🧸🧹🧺🧻" \
+"🧼🧽🧾🧿🩰🩱🩲🩳🩴🩸🩹🩺🩻🩼🪀🪁🪂🪃🪄🪅🪆🪐🪑🪒🪓🪔🪕🪖🪗🪘🪙🪚🪛🪜🪝🪞🪟🪠🪡🪢" \
+"🪣🪤🪥🪦🪧🪨🪩🪪🪫🪬🪰🪱🪲🪳🪴🪵🪶🪷🪸🪹🪺🫀🫁🫂🫃🫄🫅🫐🫑🫒🫓🫔🫕🫖🫗🫘🫙🫠🫡🫢" \
 "🫣🫤🫥🫦🫧🫰🫱🫲🫳🫴🫵🫶"
 ;
 #endif
 
 // chess
 #ifndef _LA_ICO_CHESS
-#define _LA_ICO_CHESS\
-"🨀🨁🨂🨃🨄🨅🨆🨇🨈🨉🨊🨋🨌🨍🨎🨏🨐🨑🨒🨓🨔🨕🨖🨗🨘🨙🨚🨛🨜🨝🨞🨟🨠🨡🨢🨣🨤🨥🨦🨧"\
-"🨨🨩🨪🨫🨬🨭🨮🨯🨰🨱🨲🨳🨴🨵🨶🨷🨸🨹🨺🨻🨼🨽🨾🨿🩀🩁🩂🩃🩄🩅🩆🩇🩈🩉🩊🩋🩌🩍🩎🩏"\
+#define _LA_ICO_CHESS \
+"🨀🨁🨂🨃🨄🨅🨆🨇🨈🨉🨊🨋🨌🨍🨎🨏🨐🨑🨒🨓🨔🨕🨖🨗🨘🨙🨚🨛🨜🨝🨞🨟🨠🨡🨢🨣🨤🨥🨦🨧" \
+"🨨🨩🨪🨫🨬🨭🨮🨯🨰🨱🨲🨳🨴🨵🨶🨷🨸🨹🨺🨻🨼🨽🨾🨿🩀🩁🩂🩃🩄🩅🩆🩇🩈🩉🩊🩋🩌🩍🩎🩏" \
 "🩐🩑🩒🩓🩠🩡🩢🩣🩤🩥🩦🩧🩨🩩🩪🩫🩬🩭"
 ;
 #endif

+ 5 - 5
la_interface.h

@@ -1350,20 +1350,20 @@ void laRegisterNode(laBaseNodeType* type, laPropContainer* pc,
 
 void latouched_NodeInSocket(void* unused, int hint);
 
-#define LA_BASE_NODE_HEADER(uil,c,This)\
+#define LA_BASE_NODE_HEADER(uil,c,This) \
     {laSplitColumn(uil,c,0.2);laColumn*c1=laLeftColumn(c,1);c=laRightColumn(c,0);\
     laShowHeightAdjuster(uil,c1,This,"base.__gap",0);}
 
-#define LA_IDN_REGISTER(uitext,icon,a,pc,init,destroy,visit,eval,type)\
+#define LA_IDN_REGISTER(uitext,icon,a,pc,init,destroy,visit,eval,type) \
     laRegisterNode(&a,pc,init,destroy,visit,eval,sizeof(type),"UDFRES_" #type, #type, uitext,icon);
 
-#define LA_SRC_AND_PARENT(socket)\
+#define LA_SRC_AND_PARENT(socket) \
     ((socket)->Source && (socket)->Source->Parent)
 
-#define LA_VISIT_NODE(node)\
+#define LA_VISIT_NODE(node) \
     {int result=node->Type->Visit(node,l); if(result!=LA_DAG_FLAG_PERM) return LA_DAG_FLAG_ERR;}
 
-#define LA_GUARD_THIS_NODE(n)\
+#define LA_GUARD_THIS_NODE(n) \
     {if(n->Base.Eval==LA_DAG_FLAG_PERM) return LA_DAG_FLAG_PERM; if(n->Base.Eval==LA_DAG_FLAG_TEMP) return LA_DAG_FLAG_ERR; n->Base.Eval=LA_DAG_FLAG_TEMP; }
 
 extern laBaseNodeType LA_IDN_KEYBOARD;

+ 1 - 1
la_kernel.c

@@ -504,7 +504,7 @@ int laGetReadyWith(int GLMajor, int GLMinor, int BufferSamples){
     tnsInitBuiltinShaders();
 
     tnsSetuptnsFontManager();
-#define LOAD_FONT(font)\
+#define LOAD_FONT(font) \
     if(!tnsLoadSystemFont(MAIN.SysFontDir, font)) printf("Can't load font \"" font "\"\n");
 
     LOAD_FONT("NotoSansCJK-Regular.ttc");

+ 27 - 10
la_tns.h

@@ -23,9 +23,26 @@
 #include <float.h>
 
 #ifdef __cplusplus
-extern "C" const char* TNS_SHADER_COLOR_COMMON;
-#else
+extern "C" {
+#endif
 extern const char* TNS_SHADER_COLOR_COMMON;
+extern const char* TNS_VERTEX_SIMPLE_MATCAP;
+extern const char* TNS_FRAGMENT_SIMPLE_MATCAP;
+extern const char* TNS_VERTEX_GRID;
+extern const char* TNS_FRAGMENT_TRANSPARNT_GRID;
+extern const char* LA_IMM_VERTEX_SHADER;
+extern const char* LA_IMM_FRAGMENT_SHADER;
+extern const char* LA_RAY_VERTEX_SHADER;
+extern const char* LA_SHADER_LIB_FXAA;
+extern const char* LA_RAY_FRAGMENT_SHADER;
+extern const char* LA_SCENE_VERTEX_SHADER;
+extern const char* LA_SCENE_FRAGMENT_SHADER;
+extern const char* LA_CASCADE_SHADOW_VERTEX_SHADER;
+extern const char* LA_CASCADE_SHADOW_FRAGMENT_SHADER;
+extern const char* LA_SELECTION_VERTEX_SHADER;
+extern const char* LA_SELECTION_FRAGMENT_SHADER;
+#ifdef __cplusplus
+}
 #endif
 
 #define TNS_PI 3.1415926535897932384626433832795
@@ -602,7 +619,7 @@ STRUCTURE(tnsMakeTransformNode){
 
 NEED_STRUCTURE(tnsBatch)
 
-#define TNS_ID_TO_COLOR(color, i)\
+#define TNS_ID_TO_COLOR(color, i) \
     {color[0]=(real)((i & 0x000000FF)>>0)/255.0; color[1]=(real)((i & 0x0000FF00)>>8)/255.0; color[2]=(real)((i & 0x00FF0000)>>16)/255.0;}
 
 #define TNS_MATERIAL_DRAW_MODE_SOLID 0
@@ -837,7 +854,7 @@ STRUCTURE(tnsEdgeHash){
 #define TNS_DOUBLE_CLOSE_ENOUGH(a, b) \
     (((a) + DBL_EDGE_LIM) >= (b) && ((a)-DBL_EDGE_LIM) <= (b))
 
-    //#define TNS_DOUBLE_CLOSE_ENOUGH(a,b)\
+    //#define TNS_DOUBLE_CLOSE_ENOUGH(a,b) \
 //(((a)+0.00000000001)>=(b) && ((a)-0.0000000001)<=(b))
 
 #define TNS_FLOAT_CLOSE_ENOUGH_WIDER(a, b) \
@@ -1016,17 +1033,17 @@ real tnsDirectionToRad(tnsVector2d Dir);
 void tnsConvert44df(tnsMatrix44d from, tnsMatrix44f to);
 int tnsTrangleLineBoundBoxTest(tnsRenderTriangle *rt, tnsRenderLine *rl);
 
-#define tnsVectorSet2(to, x,y)\
+#define tnsVectorSet2(to, x,y) \
     {(to)[0]=x;(to)[1]=y;}
-#define tnsVectorSet3(to, x,y,z)\
+#define tnsVectorSet3(to, x,y,z) \
     {(to)[0]=x;(to)[1]=y;(to)[2]=z;}
-#define tnsVectorSet4(to, x,y,z,w)\
+#define tnsVectorSet4(to, x,y,z,w) \
     {(to)[0]=x;(to)[1]=y;(to)[2]=z;(to)[3]=w;}
-#define tnsVectorSet2v(to, from)\
+#define tnsVectorSet2v(to, from) \
     tnsVectorSet2(to,(from)[0],(from)[1])
-#define tnsVectorSet3v(to, from)\
+#define tnsVectorSet3v(to, from) \
     tnsVectorSet3(to,(from)[0],(from)[1],(from)[2])
-#define tnsVectorSet4v(to, from)\
+#define tnsVectorSet4v(to, from) \
     tnsVectorSet4(to,(from)[0],(from)[1],(from)[2],(from)[3])
 
 real tnsDistIdv2(real x1, real y1, real x2, real y2);

+ 14 - 312
la_tns_kernel.c

@@ -22,310 +22,6 @@
 #include "freetype/ftadvanc.h"
 #include <png.h>
 
-char TNS_VERTEX_SIMPLE_MATCAP[] = "#version 330\n"
-"uniform mat4 mProjection;\n"
-"uniform mat4 mModel;\n"
-"uniform mat4 mView;\n"
-"\n"
-"in vec4 vVertex;\n"
-"in vec3 vNormal;\n"
-"smooth out vec3 fNormal;\n"
-"\n"
-"void main(){\n"
-"    gl_Position = mProjection * mView  * mModel * vVertex;\n"
-"    vec3 N = ( mView * mModel * vec4(vNormal,0)).xyz;\n"
-"    fNormal = normalize(N);\n"
-"}";
-char TNS_FRAGMENT_SIMPLE_MATCAP[] = "#version 330\n"
-"\n"
-"smooth in vec3 fNormal;"
-"\n"
-"float Interpolate(float between1,float between2,float value1,float value2,float key){\n"
-"    float i = (key-between1)/(between2-between1);\n"
-"    return value1*(1-i)+value2*i;"
-"}\n"
-"void main(){\n"
-"    float value = dot(vec3(0,0,1),fNormal);\n"
-"    if(value<0.65) value=0.15;\n"
-"    else if(value>=0.65 && value<0.85) value=Interpolate(0.65,0.85,0.15,0.75,value);\n"
-"    else if(value>=0.85 && value<0.95) value=0.75;\n"
-"    else if(value>=0.95) value=0.9;\n"
-"    gl_FragColor = vec4(vec3(0.84, 0.41, 0.16)*value,1);\n"
-"}";
-
-char TNS_VERTEX_GRID[] = "#version 330\n"
-"\n"
-"uniform mat4 mProjection;\n"
-"uniform mat4 mModel;\n"
-"uniform mat4 mView;\n"
-"\n"
-"in vec4 vVertex;\n"
-"in vec4 vColor;\n"
-"in vec2 vUV;\n"
-"out vec4 fColor;\n"
-"out vec2 uv;\n"
-"\n"
-"void main(){\n"
-"    vec4 pos = mProjection * mView * mModel * vVertex;\n"
-"    gl_Position = pos;\n"
-"    fColor = vColor;\n"
-"    uv = vUV;\n"
-"}";
-
-char TNS_FRAGMENT_TRANSPARNT_GRID[] = "#version 330\n"
-"\n"
-"in vec4 fColor;\n"
-"in vec2 uv;\n"
-"\n"
-"void main(){\n"
-"    vec4 c = fColor;\n"
-"    c.a = sin(uv.x)*sin(uv.y)>0?c.a:0;\n"
-"    gl_FragColor = c;\n"
-"}";
-
-const char LA_IMM_VERTEX_SHADER[] = "#version 330\n\
-uniform mat4 mProjection;\
-uniform mat4 mModel;\
-uniform mat4 mView;\
-in vec4 vVertex;\
-in vec4 vColor;\
-in vec3 vNormal;\
-in vec2 vUV;\
-out vec4 fColor;\
-out vec2 fUV;\
-flat out vec3 fNormal;\
-out vec3 fGPos;\
-void main(){\
-    gl_Position = mProjection * mView * mModel * vVertex;\
-    fColor = vColor;\
-    fUV=vUV;\
-    fGPos=vec3((mModel * vVertex).xyz);\
-    fNormal= (mModel * vec4(vNormal,0.)).xyz;\
-}";
-const char LA_IMM_FRAGMENT_SHADER[] = "#version 330\n\
-uniform sampler2D TexColor;\
-uniform sampler2DMS TexColorMS;\
-uniform int TextureMode;\n\
-uniform int ColorMode;\n\
-uniform int MultiplyColor;\n\
-uniform int SampleAmount;\n\
-uniform int UseNormal;\n\
-uniform int InputColorSpace;\n\
-uniform int OutputColorSpace;\n\
-uniform int ShowStripes;\n\
-uniform float HCYGamma;\n\
-uniform vec3 uViewPos;\n\
-in vec4 fColor;\n\
-in vec2 fUV;\n\
-flat in vec3 fNormal;\n\
-in vec3 fGPos;\n\
-layout(location = 0) out vec4 outColor;\n\
-layout(location = 1) out vec3 outNormal;\n\
-layout(location = 2) out vec3 outGPos;\n\
-#with TNS_SHADER_COLOR_COMMON\n\
-vec3 ConvertColorSpace(vec3 color){\n\
-    if(InputColorSpace!=OutputColorSpace){\n\
-        if(ColorMode==0){\n\
-            if(InputColorSpace==0) color=to_linear_srgb(color);\n\
-            else if(InputColorSpace==1) color=to_linear_clay(color);\n\
-        } \n\
-        vec3 xyz; if(ColorMode==1){ color.y=pow(color.y,max(HCYGamma,1)); color=okhsl_to_linear_srgb(color); }\n\
-        if(InputColorSpace==1){ xyz=Clay2XYZ(color); }\n\
-        if(InputColorSpace==0){ xyz=sRGB2XYZ(color); }\n\
-        if(OutputColorSpace==0){ color=to_log_srgb(XYZ2sRGB(xyz)); }\n\
-        if(OutputColorSpace==1){ color=to_log_clay(XYZ2Clay(xyz)); }\n\
-    }else{\n\
-        if(ColorMode==1){ color.y=pow(color.y,max(HCYGamma,1)); color=okhsl_to_srgb(color); }\n\
-        else if(ColorMode==0){ color=color; }\n\
-        else{\n\
-            if(OutputColorSpace==0){ color=to_log_srgb(color); }\n\
-            if(OutputColorSpace==1){ color=to_log_clay(color); }\n\
-        }\n\
-    }\n\
-    if(ShowStripes!=0){\n\
-        if(color.r>1.00001||color.g>1.00001||color.b>1.00001||color.r<0||color.g<0||color.b<0){ color=mix(color,vec3(0.5,0.5,0.5),(sin((gl_FragCoord.x+gl_FragCoord.y)/2)>0)?1:0.5); }\n\
-    }\n\
-    return color;\n\
-}\n\
-void main(){\n\
-    vec4 color=vec4(1,0,1,1);\n\
-    if(TextureMode==0){ color = fColor;}\n\
-    else if(TextureMode==1){color = vec4(fColor.rgb,fColor.a*texture2D(TexColor,fUV.st).r);}\n\
-    else if(TextureMode==2){\n\
-        color=texture2D(TexColor,fUV.st);\n\
-        if(MultiplyColor!=0){color*=fColor;}\n\
-    }else if(TextureMode==3){\n\
-        color=vec4(0,0,0,0);\n\
-        ivec2 texSize = textureSize(TexColorMS);\n\
-        for(int i=0;i<SampleAmount;i++) color+=texelFetch(TexColorMS, ivec2(fUV * texSize),i);\n\
-        color/=SampleAmount;\n\
-        if(MultiplyColor!=0){color*=fColor;}\n\
-    }\n\
-    if(UseNormal!=0){\n\
-        float light_factor=dot(fNormal,vec3(0,0,1));\n\
-        float view=dot(fNormal,fGPos-uViewPos);\n\
-        float factor=abs(light_factor);\n\
-        if(light_factor*view>0){ factor=0; }\n\
-        color=vec4(color.rgb*mix(0.2,1.,factor),color.a);\n\
-        vec3 oNormal=fNormal; if(view<0){ oNormal=-fNormal; }\n\
-        outNormal = oNormal;\n\
-    }\n\
-    color=vec4(ConvertColorSpace(color.rgb),color.a); color.a=clamp(color.a,0,1);\n\
-    outColor = color; \n\
-    outGPos = fGPos;\n\
-}";
-const char LA_RAY_VERTEX_SHADER[] = "#version 330\n\
-in vec3 vUV;\n\
-in vec4 vVertex;\n\
-out vec3 fViewDir;\n\
-void main(){\n\
-    gl_Position=vVertex;\n\
-    fViewDir = vUV;\n\
-}";
-
-#define LA_SHADER_LIB_FXAA \
-"#define DIFF_LUM_ABS_HOLD 0.0833 \n\
-#define DIFF_LUM_RES_HOLD 0.166\n\
-float luminance(vec3 col) {\n\
-    return dot(col, vec3(0.2126729f,  0.7151522f, 0.0721750f));\n\
-}\n\
-vec4 fxaa(in sampler2D tex, vec2 uv, vec2 texsize) {\n\
-    vec3 e = vec3(-1., 1., 0.);\n\
-    vec2 offuv = uv;\n\
-	vec3 colnw = texture(tex, uv + e.xy / texsize).rgb;\n\
-    vec3 coln  = texture(tex, uv + e.zy / texsize).rgb;\n\
-    vec3 colne = texture(tex, uv + e.yy / texsize).rgb;\n\
-    vec3 colw  = texture(tex, uv + e.xz / texsize).rgb;\n\
-    vec4 colm4  = texture(tex, uv + e.zz / texsize);\n\
-    vec3 colm  = colm4.rgb;\n\
-    vec3 cole  = texture(tex, uv + e.yz / texsize).rgb;\n\
-    vec3 colsw = texture(tex, uv + e.xx / texsize).rgb;\n\
-    vec3 cols  = texture(tex, uv + e.zx / texsize).rgb;\n\
-    vec3 colse = texture(tex, uv + e.yx / texsize).rgb;\n\
-    float lnw = luminance(colnw), ln = luminance(coln), lne = luminance(colne),\n\
-          lw  = luminance(colw),  lm = luminance(colm), le  = luminance(cole),\n\
-          lsw = luminance(colsw), ls = luminance(cols), lse = luminance(colse);\n\
-    float maxl = max(ln, max(ls, max(lw, max(le, lm))));\n\
-    float minl = min(ln, min(ls, min(lw, min(le, lm))));\n\
-    float diff = maxl - minl;\n\
-    if (diff < max(DIFF_LUM_ABS_HOLD, DIFF_LUM_RES_HOLD * maxl)) return colm4;\n\
-    float filterfactor = 0.;\n\
-    filterfactor += 2. * (ln + lw + ls + le) + lnw + lne + lsw + lse;\n\
-    filterfactor /= 12.;\n\
-    filterfactor = abs(filterfactor - lm);\n\
-    filterfactor = clamp(filterfactor / diff, 0., 1.);\n\
-    float blend = smoothstep(0., 1., filterfactor);\n\
-    blend *= blend;\n\
-    float hedge = 2.*(ln + ls - 2.*lm) + (lne + lse - 2.*le) + (lnw + lsw - 2.*lw);\n\
-    float vedge = 2.*(le + lw - 2.*lm) + (lne + lnw - 2.*ln) + (lse + lsw - 2.*ls);\n\
-    float ish = step(vedge, hedge);\n\
-    float psoff = ish >= 1.0 ? 1./texsize.y : 1./texsize.x;\n\
-    float pleft = ish >= 1.0 ? ln : le;\n\
-    float pright = ish >= 1.0 ? ls : lw;\n\
-    if (abs(pleft - lm) < abs(pright - lm)) psoff = -psoff;\n\
-    if (ish >= 1.0) { offuv.y += psoff * blend; }else{ offuv.x += psoff * blend; }\n\
-    return vec4(texture(tex, offuv).rgb,colm4.a);  \n\
-}\n"
-
-const char LA_RAY_FRAGMENT_SHADER[] = "#version 330\n\
-uniform vec3 uViewDir;\n\
-uniform vec3 uViewPos;\n\
-uniform float uFOV;\n\
-in vec3 fViewDir;\n\
-uniform sampler2D TexColor;\n\
-uniform sampler2D TexNormal;\n\
-uniform sampler2D TexGPos;\n"
-LA_SHADER_LIB_FXAA
-"void main(){\n\
-    float d=dot(uViewDir,normalize(fViewDir));\n\
-    float target=cos(uFOV/2.);\n\
-    vec4 color=vec4(1.,1.,1.,1.); float mul=0.;\n\
-    //if(d<(target+0.005)&&d>target) mul=1.0;\n\
-    vec2 uv=gl_FragCoord.xy/textureSize(TexColor,0);\n\
-    vec4 buffer_color=fxaa(TexColor,uv,textureSize(TexColor,0));\n\
-    //vec4 buffer_color=texture2D(TexColor,uv);\n\
-    gl_FragColor = mul*color+buffer_color;\n\
-}";
-const char LA_SCENE_VERTEX_SHADER[] = "#version 330\n\
-uniform mat4 mProjection;\n\
-uniform mat4 mModel;\n\
-uniform mat4 mView;\n\
-uniform mat4 mShadow;\n\
-in vec4 vVertex;\n\
-in vec4 vColor;\n\
-in vec4 vNormal;\n\
-in vec2 vUV;\n\
-out vec4 fColor;\n\
-//out vec4 fNormal;\n\
-out vec2 fUV;\n\
-out vec4 fGPos;\n\
-void main(){\n\
-    gl_Position= mProjection * mView * mModel * vVertex;\n\
-    fUV=vUV;\n\
-    //fNormal=vNormal;\n\
-    fColor=vColor;\n\
-    fGPos= mShadow * mModel * vVertex;\
-}";
-const char LA_SCENE_FRAGMENT_SHADER[] = "#version 330\n\
-uniform sampler2D TexColor;\n\
-uniform sampler2DMS TexColorMS;\
-uniform int TextureMode;\n\
-uniform int SampleAmount;\n\
-uniform int MultiplyColor;\n\
-in vec4 fColor;\n\
-//in vec4 fNormal;\n\
-in vec2 fUV;\n\
-in vec4 fGPos;\n\
-vec4 GetTexture(vec2 uv){\n\
-    vec4 color=vec4(1,0,1,1);\n\
-    if(TextureMode==1 || TextureMode==2){ return texture2D(TexColor,uv); }\n\
-    else if(TextureMode==3){\n\
-        ivec2 texSize = textureSize(TexColorMS);\n\
-        for(int i=0;i<SampleAmount;i++) color+=texelFetch(TexColorMS, ivec2(fUV * texSize),i);\n\
-        color/=SampleAmount;\n\
-        if(MultiplyColor!=0){color*=fColor;}\n\
-        return color;\n\
-    }\n\
-    else return vec4(1,0,1,1);\n\
-}\n\
-float GetShadow(vec4 GPos){\n\
-    vec3 projCoords = GPos.xyz / GPos.w;\n\
-    projCoords = projCoords * 0.5 + 0.5;\n\
-    float closestDepth = GetTexture(projCoords.xy).r;\n\
-    float currentDepth = projCoords.z;\n\
-    float shadow = currentDepth > (closestDepth+0.001)  ? 0.5 : 1.0;\n\
-    return shadow;\n\
-}\n\
-void main(){\n\
-    gl_FragColor=GetShadow(fGPos)*fColor;\n\
-}";
-
-const char LA_CASCADE_SHADOW_VERTEX_SHADER[] = "#version 330\n\
-in vec4 vVertex;\n\
-uniform mat4 mModel;\n\
-uniform mat4 mShadow;\n\
-void main(){\n\
-    gl_Position=mShadow*mModel*vVertex;\n\
-}";
-const char LA_CASCADE_SHADOW_FRAGMENT_SHADER[] = "#version 330\nvoid main(){gl_FragDepth = gl_FragCoord.z;}";
-
-const char LA_SELECTION_VERTEX_SHADER[] = "#version 330\n\
-in vec4 vVertex;\n\
-in vec3 vColor;\n\
-uniform mat4 mProjection;\n\
-uniform mat4 mModel;\n\
-uniform mat4 mView;\n\
-flat out vec3 fIdColor;\n\
-void main(){\n\
-    gl_Position = mProjection * mView * mModel * vVertex;\n\
-    fIdColor = vColor;\n\
-}";
-const char LA_SELECTION_FRAGMENT_SHADER[] = "#version 330\n\
-flat in vec3 fIdColor;\n\
-void main(){\n\
-    gl_FragColor=vec4(fIdColor,1.);\n\
-}";
-
 #define HF 0.5
 
 //  1  2
@@ -614,7 +310,10 @@ void tnsShaderApplyShadowMatrix(tnsShader *tns, tnsMatrix44d m){
 }
 
 char* tnsEnsureShaderCommoms(char* Content){
-    return strSub(Content,"#with TNS_SHADER_COLOR_COMMON",TNS_SHADER_COLOR_COMMON);
+    char* c=0;
+    c=strSub(Content,"#with TNS_SHADER_COLOR_COMMON",TNS_SHADER_COLOR_COMMON);
+    c=strSub(c,"#with LA_SHADER_LIB_FXAA",LA_SHADER_LIB_FXAA);
+    return c;
 }
 int tnsNewVertexShader(char *Content){
     int status = 0;
@@ -627,15 +326,16 @@ int tnsNewVertexShader(char *Content){
     VertexShaderObject = glCreateShader(GL_VERTEX_SHADER);
 
     char* UseContent=tnsEnsureShaderCommoms(Content);
-    glShaderSource(VertexShaderObject, 1, &UseContent, 0); free(UseContent);
+    glShaderSource(VertexShaderObject, 1, &UseContent, 0);
     glCompileShader(VertexShaderObject);
     glGetShaderiv(VertexShaderObject, GL_COMPILE_STATUS, &status);
     if (status == GL_FALSE){
         glGetShaderInfoLog(VertexShaderObject, sizeof(error), 0, error);
         printf("Vertex shader error:\n%s", error);
-        glDeleteShader(VertexShaderObject);
+        glDeleteShader(VertexShaderObject); free(UseContent);
         return -1;
     }
+    free(UseContent);
 
     return VertexShaderObject;
 }
@@ -650,15 +350,16 @@ int tnsNewFragmentShader(char *Content){
     FragmentShaderObject = glCreateShader(GL_FRAGMENT_SHADER);
 
     char* UseContent=tnsEnsureShaderCommoms(Content);
-    glShaderSource(FragmentShaderObject, 1, &UseContent, 0); free(UseContent);
+    glShaderSource(FragmentShaderObject, 1, &UseContent, 0);
     glCompileShader(FragmentShaderObject);
     glGetShaderiv(FragmentShaderObject, GL_COMPILE_STATUS, &status);
     if (status == GL_FALSE){
         glGetShaderInfoLog(FragmentShaderObject, sizeof(error), 0, error);
         printf("Fragment shader error:\n%s", error);
-        glDeleteShader(FragmentShaderObject);
+        glDeleteShader(FragmentShaderObject); free(UseContent);
         return -1;
     }
+    free(UseContent);
 
     return FragmentShaderObject;
 }
@@ -673,16 +374,17 @@ int tnsNewGeometryShader(char *Content){
     GeometryShaderObject = glCreateShader(GL_GEOMETRY_SHADER);
 
     char* UseContent=tnsEnsureShaderCommoms(Content);
-    glShaderSource(GeometryShaderObject, 1, &UseContent, 0); free(UseContent);
+    glShaderSource(GeometryShaderObject, 1, &UseContent, 0);
     glCompileShader(GeometryShaderObject);
     glGetShaderiv(GeometryShaderObject, GL_COMPILE_STATUS, &status);
     if (status == GL_FALSE){
         glGetShaderInfoLog(GeometryShaderObject, sizeof(error), 0, error);
         printf("Geometry shader error:\n%s", error);
-        glDeleteShader(GeometryShaderObject);
+        glDeleteShader(GeometryShaderObject); free(UseContent);
         return -1;
     }
-
+    free(UseContent);
+    
     return GeometryShaderObject;
 }
 

+ 11 - 11
la_util.h

@@ -35,14 +35,14 @@
 #include <errno.h>
 #include <wchar.h>
 
-#define NEED_STRUCTURE(a)\
+#define NEED_STRUCTURE(a) \
 typedef struct _##a a;
 
-#define STRUCTURE(a)\
+#define STRUCTURE(a) \
 typedef struct _##a a;\
 struct _##a
 
-#define lengthof(a)\
+#define lengthof(a) \
 (sizeof(a)/sizeof(a[0]))
 
 #define DBL_TRIANGLE_LIM 1e-11
@@ -57,7 +57,7 @@ struct _##a
 //#define LAGUI_GIT_HASH "?"
 //#endif
 
-#define LA_HYPER_CREATED_TIME(hi)\
+#define LA_HYPER_CREATED_TIME(hi) \
 hi->TimeCreated.Year,hi->TimeCreated.Month,hi->TimeCreated.Day,hi->TimeCreated.Hour,hi->TimeCreated.Minute,hi->TimeCreated.Second
 
 
@@ -252,7 +252,7 @@ STRUCTURE(laStringEdit) {
 	int MouseSelecting;
 };
 
-#define LA_SWAP(T,x,y)\
+#define LA_SWAP(T,x,y) \
 	{ T SWAP = x; x = y; y = SWAP; }
 
 #define LA_MEMORY_POOL_1MB   1048576
@@ -387,19 +387,19 @@ STRUCTURE(laBaseNode){
 };
 
 
-#define CreateNew(Type)\
+#define CreateNew(Type) \
     calloc(sizeof(Type),1)
 
-#define CreateNew_Size(size)\
+#define CreateNew_Size(size) \
     calloc(size,1)
 
-#define CreateNewBuffer(Type,Num)\
+#define CreateNewBuffer(Type,Num) \
     calloc(sizeof(Type),Num);
 
-#define FreeMem(ptr)\
+#define FreeMem(ptr) \
     nutFreeMem((&ptr))
 
-#define elif\
+#define elif \
         else if
 
 #define LA_UNAVAILABLE_NAME "- Unknown -"
@@ -655,5 +655,5 @@ void transInitTranslation_zh_cn();
 
 void laOpenInternetLink(char* url);
 
-#define SEND_PANIC_ERROR(msg)\
+#define SEND_PANIC_ERROR(msg) \
 	{printf(msg); exit(0);}

+ 2 - 2
resources/la_modelling.c

@@ -1007,9 +1007,9 @@ STRUCTURE(MMakeData){
     laListHandle Islands; int NumIslands;
 };
 
-#define M_SHOULD_INCL_PRIM(m)\
+#define M_SHOULD_INCL_PRIM(m) \
     ((!(m->flags&TNS_MESH_FLAG_PICKED)) && (m->flags&TNS_MESH_FLAG_SELECTED))
-#define M_SHOULD_USE_OE(oe,sf)\
+#define M_SHOULD_USE_OE(oe,sf) \
     (((!oe->fl)&&((!sf)||(oe->fr!=sf)))||((!oe->fr)&&((!sf)||(oe->fl!=sf))))
 
 MIslandInfo* la_NewMIsland(MMakeData* md){ MIslandInfo* ii=memAcquireSimple(sizeof(MIslandInfo)); lstAppendItem(&md->Islands, ii); md->NumIslands++; return ii; }

+ 5 - 5
resources/la_nodes_basic.c

@@ -65,7 +65,7 @@ laNodeCategory* LA_NODE_CATEGORY_AUX;
 laNodeCategory* LA_NODE_CATEGORY_DRIVER;
 laNodeCategory* LA_NODE_CATEGORY_COLOR;
 
-#define LA_IDN_CONTROLLER_RESET_SOCKET(ns)\
+#define LA_IDN_CONTROLLER_RESET_SOCKET(ns) \
     {ns->IntVal[0]=0; ns->Out->DataType=LA_PROP_INT; ns->Offset=0; ns->Out->Data=&ns->IntVal;}
 
 void IDN_ControllerInit(laInputControllerNode* n, int NoCreate){
@@ -469,7 +469,7 @@ int IDN_MathVisit(laMathNode* n, laListHandle* l){
     lstAppendPointer(l, n);
     return LA_DAG_FLAG_PERM;
 }
-#define LA_GET_SRC_AS_FLOAT(var, socket)\
+#define LA_GET_SRC_AS_FLOAT(var, socket) \
     {if(socket->Source->DataType&LA_PROP_FLOAT) var=*((real*)socket->Source->Data);\
     if(socket->Source->DataType&(LA_PROP_INT|LA_PROP_ENUM)) var=*((int*)socket->Source->Data);}
 int IDN_MathEval(laMathNode* n){
@@ -637,7 +637,7 @@ int IDN_VectorMathVisit(laVectorMathNode* n, laListHandle* l){
     lstAppendPointer(l, n);
     return LA_DAG_FLAG_PERM;
 }
-#define LA_GET_SRC_AS_FLOAT_THINGS(var, socket, maxlen)\
+#define LA_GET_SRC_AS_FLOAT_THINGS(var, socket, maxlen) \
     {if(socket->Source->DataType&LA_PROP_FLOAT){ real*adr=socket->Source->Data; maxlen=TNS_MIN2(TNS_MAX2(1,socket->Source->ArrLen),maxlen); for(int i=0;i<maxlen;i++){ var[i]=adr[i]; } }\
     if(socket->Source->DataType&(LA_PROP_INT|LA_PROP_ENUM)){ int*adr=socket->Source->Data; maxlen=TNS_MIN2(TNS_MAX2(1,socket->Source->ArrLen),maxlen); for(int i=0;i<maxlen;i++){ var[i]=adr[i]; } }\
     }
@@ -1163,8 +1163,8 @@ void la_RegisterInputMapperOperators(){
     laAddEnumItemAs(p,"MUL", "Multiply", "L x R", LA_MATRIX_NODE_OP_MUL, 0);
     laAddEnumItemAs(p,"INV", "Invert", "Invert L or R", LA_MATRIX_NODE_OP_INV, 0);
 
-#define REGISTER_MATH_NODE\
-    laPropContainerExtraFunctions(pc,0,0,0,0,laui_DefaultNodeOperationsPropUiDefine);\
+#define REGISTER_MATH_NODE \
+    laPropContainerExtraFunctions(pc,0,0,0,0,laui_DefaultNodeOperationsPropUiDefine); \
     laAddSubGroup(pc,"base","Base","Base node","la_base_node",0,0,0,0,0,0,0,0,0,0,0,LA_UDF_LOCAL);\
     laAddFloatProperty(pc, "vl", "L", "Left value", 0,0,0,0,0,0,0,0,offsetof(laMathNode, ValueL),0,0,0,0,0,0,0,0,0,0,0);\
     laAddFloatProperty(pc, "vr", "R", "Right value", 0,0,0,0,0,0,0,0,offsetof(laMathNode, ValueR),0,0,0,0,0,0,0,0,0,0,0);\

+ 0 - 554
resources/la_tns_als.c

@@ -1,554 +0,0 @@
-/*
-* LaGUI: A graphical application framework.
-* Copyright (C) 2022-2023 Wu Yiming
-*
-* This program is free software: you can redistribute it and/or modify
-* it under the terms of the GNU General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "la_5.h"
-
-const int TRANSMITTANCE_TEXTURE_WIDTH = 256;
-const int TRANSMITTANCE_TEXTURE_HEIGHT = 64;
-
-const int SCATTERING_TEXTURE_R_SIZE = 32;
-const int SCATTERING_TEXTURE_MU_SIZE = 128;
-const int SCATTERING_TEXTURE_MU_S_SIZE = 32;
-const int SCATTERING_TEXTURE_NU_SIZE = 8;
-
-const int SCATTERING_TEXTURE_WIDTH =
-    SCATTERING_TEXTURE_NU_SIZE * SCATTERING_TEXTURE_MU_S_SIZE;
-const int SCATTERING_TEXTURE_HEIGHT = SCATTERING_TEXTURE_MU_SIZE;
-const int SCATTERING_TEXTURE_DEPTH = SCATTERING_TEXTURE_R_SIZE;
-
-const int IRRADIANCE_TEXTURE_WIDTH = 64;
-const int IRRADIANCE_TEXTURE_HEIGHT = 16;
-
-// The conversion factor between watts and lumens.
-const double MAX_LUMINOUS_EFFICACY = 683.0;
-
-// Values from "CIE (1931) 2-deg color matching functions", see
-// "http://web.archive.org/web/20081228084047/
-//    http://www.cvrl.org/database/data/cmfs/ciexyz31.txt".
-const double CIE_2_DEG_COLOR_MATCHING_FUNCTIONS[380] = {
-  360, 0.000129900000, 0.000003917000, 0.000606100000,
-  365, 0.000232100000, 0.000006965000, 0.001086000000,
-  370, 0.000414900000, 0.000012390000, 0.001946000000,
-  375, 0.000741600000, 0.000022020000, 0.003486000000,
-  380, 0.001368000000, 0.000039000000, 0.006450001000,
-  385, 0.002236000000, 0.000064000000, 0.010549990000,
-  390, 0.004243000000, 0.000120000000, 0.020050010000,
-  395, 0.007650000000, 0.000217000000, 0.036210000000,
-  400, 0.014310000000, 0.000396000000, 0.067850010000,
-  405, 0.023190000000, 0.000640000000, 0.110200000000,
-  410, 0.043510000000, 0.001210000000, 0.207400000000,
-  415, 0.077630000000, 0.002180000000, 0.371300000000,
-  420, 0.134380000000, 0.004000000000, 0.645600000000,
-  425, 0.214770000000, 0.007300000000, 1.039050100000,
-  430, 0.283900000000, 0.011600000000, 1.385600000000,
-  435, 0.328500000000, 0.016840000000, 1.622960000000,
-  440, 0.348280000000, 0.023000000000, 1.747060000000,
-  445, 0.348060000000, 0.029800000000, 1.782600000000,
-  450, 0.336200000000, 0.038000000000, 1.772110000000,
-  455, 0.318700000000, 0.048000000000, 1.744100000000,
-  460, 0.290800000000, 0.060000000000, 1.669200000000,
-  465, 0.251100000000, 0.073900000000, 1.528100000000,
-  470, 0.195360000000, 0.090980000000, 1.287640000000,
-  475, 0.142100000000, 0.112600000000, 1.041900000000,
-  480, 0.095640000000, 0.139020000000, 0.812950100000,
-  485, 0.057950010000, 0.169300000000, 0.616200000000,
-  490, 0.032010000000, 0.208020000000, 0.465180000000,
-  495, 0.014700000000, 0.258600000000, 0.353300000000,
-  500, 0.004900000000, 0.323000000000, 0.272000000000,
-  505, 0.002400000000, 0.407300000000, 0.212300000000,
-  510, 0.009300000000, 0.503000000000, 0.158200000000,
-  515, 0.029100000000, 0.608200000000, 0.111700000000,
-  520, 0.063270000000, 0.710000000000, 0.078249990000,
-  525, 0.109600000000, 0.793200000000, 0.057250010000,
-  530, 0.165500000000, 0.862000000000, 0.042160000000,
-  535, 0.225749900000, 0.914850100000, 0.029840000000,
-  540, 0.290400000000, 0.954000000000, 0.020300000000,
-  545, 0.359700000000, 0.980300000000, 0.013400000000,
-  550, 0.433449900000, 0.994950100000, 0.008749999000,
-  555, 0.512050100000, 1.000000000000, 0.005749999000,
-  560, 0.594500000000, 0.995000000000, 0.003900000000,
-  565, 0.678400000000, 0.978600000000, 0.002749999000,
-  570, 0.762100000000, 0.952000000000, 0.002100000000,
-  575, 0.842500000000, 0.915400000000, 0.001800000000,
-  580, 0.916300000000, 0.870000000000, 0.001650001000,
-  585, 0.978600000000, 0.816300000000, 0.001400000000,
-  590, 1.026300000000, 0.757000000000, 0.001100000000,
-  595, 1.056700000000, 0.694900000000, 0.001000000000,
-  600, 1.062200000000, 0.631000000000, 0.000800000000,
-  605, 1.045600000000, 0.566800000000, 0.000600000000,
-  610, 1.002600000000, 0.503000000000, 0.000340000000,
-  615, 0.938400000000, 0.441200000000, 0.000240000000,
-  620, 0.854449900000, 0.381000000000, 0.000190000000,
-  625, 0.751400000000, 0.321000000000, 0.000100000000,
-  630, 0.642400000000, 0.265000000000, 0.000049999990,
-  635, 0.541900000000, 0.217000000000, 0.000030000000,
-  640, 0.447900000000, 0.175000000000, 0.000020000000,
-  645, 0.360800000000, 0.138200000000, 0.000010000000,
-  650, 0.283500000000, 0.107000000000, 0.000000000000,
-  655, 0.218700000000, 0.081600000000, 0.000000000000,
-  660, 0.164900000000, 0.061000000000, 0.000000000000,
-  665, 0.121200000000, 0.044580000000, 0.000000000000,
-  670, 0.087400000000, 0.032000000000, 0.000000000000,
-  675, 0.063600000000, 0.023200000000, 0.000000000000,
-  680, 0.046770000000, 0.017000000000, 0.000000000000,
-  685, 0.032900000000, 0.011920000000, 0.000000000000,
-  690, 0.022700000000, 0.008210000000, 0.000000000000,
-  695, 0.015840000000, 0.005723000000, 0.000000000000,
-  700, 0.011359160000, 0.004102000000, 0.000000000000,
-  705, 0.008110916000, 0.002929000000, 0.000000000000,
-  710, 0.005790346000, 0.002091000000, 0.000000000000,
-  715, 0.004109457000, 0.001484000000, 0.000000000000,
-  720, 0.002899327000, 0.001047000000, 0.000000000000,
-  725, 0.002049190000, 0.000740000000, 0.000000000000,
-  730, 0.001439971000, 0.000520000000, 0.000000000000,
-  735, 0.000999949300, 0.000361100000, 0.000000000000,
-  740, 0.000690078600, 0.000249200000, 0.000000000000,
-  745, 0.000476021300, 0.000171900000, 0.000000000000,
-  750, 0.000332301100, 0.000120000000, 0.000000000000,
-  755, 0.000234826100, 0.000084800000, 0.000000000000,
-  760, 0.000166150500, 0.000060000000, 0.000000000000,
-  765, 0.000117413000, 0.000042400000, 0.000000000000,
-  770, 0.000083075270, 0.000030000000, 0.000000000000,
-  775, 0.000058706520, 0.000021200000, 0.000000000000,
-  780, 0.000041509940, 0.000014990000, 0.000000000000,
-  785, 0.000029353260, 0.000010600000, 0.000000000000,
-  790, 0.000020673830, 0.000007465700, 0.000000000000,
-  795, 0.000014559770, 0.000005257800, 0.000000000000,
-  800, 0.000010253980, 0.000003702900, 0.000000000000,
-  805, 0.000007221456, 0.000002607800, 0.000000000000,
-  810, 0.000005085868, 0.000001836600, 0.000000000000,
-  815, 0.000003581652, 0.000001293400, 0.000000000000,
-  820, 0.000002522525, 0.000000910930, 0.000000000000,
-  825, 0.000001776509, 0.000000641530, 0.000000000000,
-  830, 0.000001251141, 0.000000451810, 0.000000000000,
-};
-
-// The conversion matrix from XYZ to linear sRGB color spaces.
-// Values from https://en.wikipedia.org/wiki/SRGB.
-const double XYZ_TO_SRGB[9] = {
-  +3.2406, -1.5372, -0.4986,
-  -0.9689, +1.8758, +0.0415,
-  +0.0557, -0.2040, +1.0570
-};
-
-const char kVertexShader[] = "\n\
-#version 330\n\
-layout(location = 0) in vec2 vertex;\n\
-void main() {\n\
-    gl_Position = vec4(vertex, 0.0, 1.0);\n\
-}";
-
-const char kGeometryShader[] = "\n\
-#version 330\n\
-layout(triangles) in;\n\
-layout(triangle_strip, max_vertices = 3) out;\n\
-uniform int layer;\n\
-void main() {\n\
-    gl_Position = gl_in[0].gl_Position;\n\
-    gl_Layer = layer;\n\
-    EmitVertex();\n\
-    gl_Position = gl_in[1].gl_Position;\n\
-    gl_Layer = layer;\n\
-    EmitVertex();\n\
-    gl_Position = gl_in[2].gl_Position;\n\
-    gl_Layer = layer;\n\
-    EmitVertex();\n\
-    EndPrimitive();\n\
-}";
-
-const char kComputeTransmittanceShader[] = "\n\
-    layout(location = 0) out vec3 transmittance;\n\
-    void main() {\n\
-      transmittance = ComputeTransmittanceToTopAtmosphereBoundaryTexture(\n\
-          ATMOSPHERE, gl_FragCoord.xy);\n\
-    }";
-
-const char kComputeDirectIrradianceShader[] = "\n\
-    layout(location = 0) out vec3 delta_irradiance;\n\
-    layout(location = 1) out vec3 irradiance;\n\
-    uniform sampler2D transmittance_texture;\n\
-    void main() {\n\
-      delta_irradiance = ComputeDirectIrradianceTexture(\n\
-          ATMOSPHERE, transmittance_texture, gl_FragCoord.xy);\n\
-      irradiance = vec3(0.0);\n\
-    }";
-
-const char kComputeSingleScatteringShader[] = "\n\
-    layout(location = 0) out vec3 delta_rayleigh;\n\
-    layout(location = 1) out vec3 delta_mie;\n\
-    layout(location = 2) out vec4 scattering;\n\
-    layout(location = 3) out vec3 single_mie_scattering;\n\
-    uniform mat3 luminance_from_radiance;\n\
-    uniform sampler2D transmittance_texture;\n\
-    uniform int layer;\n\
-    void main() {\n\
-      ComputeSingleScatteringTexture(\n\
-          ATMOSPHERE, transmittance_texture, vec3(gl_FragCoord.xy, layer + 0.5),\n\
-          delta_rayleigh, delta_mie);\n\
-      scattering = vec4(luminance_from_radiance * delta_rayleigh.rgb,\n\
-          (luminance_from_radiance * delta_mie).r);\n\
-      single_mie_scattering = luminance_from_radiance * delta_mie;\n\
-    }";
-
-const char kComputeScatteringDensityShader[] = "\n\
-    layout(location = 0) out vec3 scattering_density;\n\
-    uniform sampler2D transmittance_texture;\n\
-    uniform sampler3D single_rayleigh_scattering_texture;\n\
-    uniform sampler3D single_mie_scattering_texture;\n\
-    uniform sampler3D multiple_scattering_texture;\n\
-    uniform sampler2D irradiance_texture;\n\
-    uniform int scattering_order;\n\
-    uniform int layer;\n\
-    void main() {\n\
-      scattering_density = ComputeScatteringDensityTexture(\n\
-          ATMOSPHERE, transmittance_texture, single_rayleigh_scattering_texture,\n\
-          single_mie_scattering_texture, multiple_scattering_texture,\n\
-          irradiance_texture, vec3(gl_FragCoord.xy, layer + 0.5),\n\
-          scattering_order);\n\
-    }";
-
-const char kComputeIndirectIrradianceShader[] = "\n\
-    layout(location = 0) out vec3 delta_irradiance;\n\
-    layout(location = 1) out vec3 irradiance;\n\
-    uniform mat3 luminance_from_radiance;\n\
-    uniform sampler3D single_rayleigh_scattering_texture;\n\
-    uniform sampler3D single_mie_scattering_texture;\n\
-    uniform sampler3D multiple_scattering_texture;\n\
-    uniform int scattering_order;\n\
-    void main() {\n\
-      delta_irradiance = ComputeIndirectIrradianceTexture(\n\
-          ATMOSPHERE, single_rayleigh_scattering_texture,\n\
-          single_mie_scattering_texture, multiple_scattering_texture,\n\
-          gl_FragCoord.xy, scattering_order);\n\
-      irradiance = luminance_from_radiance * delta_irradiance;\n\
-    }";
-
-const char kComputeMultipleScatteringShader[] = "\n\
-    layout(location = 0) out vec3 delta_multiple_scattering;\n\
-    layout(location = 1) out vec4 scattering;\n\
-    uniform mat3 luminance_from_radiance;\n\
-    uniform sampler2D transmittance_texture;\n\
-    uniform sampler3D scattering_density_texture;\n\
-    uniform int layer;\n\
-    void main() {\n\
-      float nu;\n\
-      delta_multiple_scattering = ComputeMultipleScatteringTexture(\n\
-          ATMOSPHERE, transmittance_texture, scattering_density_texture,\n\
-          vec3(gl_FragCoord.xy, layer + 0.5), nu);\n\
-      scattering = vec4(\n\
-          luminance_from_radiance *\n\
-              delta_multiple_scattering.rgb / RayleighPhaseFunction(nu),\n\
-          0.0);\n\
-    }";
-
-const char kAtmosphereShader[] = "\n\
-    uniform sampler2D transmittance_texture;\n\
-    uniform sampler3D scattering_texture;\n\
-    uniform sampler3D single_mie_scattering_texture;\n\
-    uniform sampler2D irradiance_texture;\n\
-    #ifdef RADIANCE_API_ENABLED\n\
-    RadianceSpectrum GetSolarRadiance() {\n\
-      return ATMOSPHERE.solar_irradiance /\n\
-          (PI * ATMOSPHERE.sun_angular_radius * ATMOSPHERE.sun_angular_radius);\n\
-    }\n\
-    RadianceSpectrum GetSkyRadiance(\n\
-        Position camera, Direction view_ray, Length shadow_length,\n\
-        Direction sun_direction, out DimensionlessSpectrum transmittance) {\n\
-      return GetSkyRadiance(ATMOSPHERE, transmittance_texture,\n\
-          scattering_texture, single_mie_scattering_texture,\n\
-          camera, view_ray, shadow_length, sun_direction, transmittance);\n\
-    }\n\
-    RadianceSpectrum GetSkyRadianceToPoint(\n\
-        Position camera, Position point, Length shadow_length,\n\
-        Direction sun_direction, out DimensionlessSpectrum transmittance) {\n\
-      return GetSkyRadianceToPoint(ATMOSPHERE, transmittance_texture,\n\
-          scattering_texture, single_mie_scattering_texture,\n\
-          camera, point, shadow_length, sun_direction, transmittance);\n\
-    }\n\
-    IrradianceSpectrum GetSunAndSkyIrradiance(\n\
-       Position p, Direction normal, Direction sun_direction,\n\
-       out IrradianceSpectrum sky_irradiance) {\n\
-      return GetSunAndSkyIrradiance(ATMOSPHERE, transmittance_texture,\n\
-          irradiance_texture, p, normal, sun_direction, sky_irradiance);\n\
-    }\n\
-    #endif\n\
-    Luminance3 GetSolarLuminance() {\n\
-      return ATMOSPHERE.solar_irradiance /\n\
-          (PI * ATMOSPHERE.sun_angular_radius * ATMOSPHERE.sun_angular_radius) *\n\
-          SUN_SPECTRAL_RADIANCE_TO_LUMINANCE;\n\
-    }\n\
-    Luminance3 GetSkyLuminance(\n\
-        Position camera, Direction view_ray, Length shadow_length,\n\
-        Direction sun_direction, out DimensionlessSpectrum transmittance) {\n\
-      return GetSkyRadiance(ATMOSPHERE, transmittance_texture,\n\
-          scattering_texture, single_mie_scattering_texture,\n\
-          camera, view_ray, shadow_length, sun_direction, transmittance) *\n\
-          SKY_SPECTRAL_RADIANCE_TO_LUMINANCE;\n\
-    }\n\
-    Luminance3 GetSkyLuminanceToPoint(\n\
-        Position camera, Position point, Length shadow_length,\n\
-        Direction sun_direction, out DimensionlessSpectrum transmittance) {\n\
-      return GetSkyRadianceToPoint(ATMOSPHERE, transmittance_texture,\n\
-          scattering_texture, single_mie_scattering_texture,\n\
-          camera, point, shadow_length, sun_direction, transmittance) *\n\
-          SKY_SPECTRAL_RADIANCE_TO_LUMINANCE;\n\
-    }\n\
-    Illuminance3 GetSunAndSkyIlluminance(\n\
-       Position p, Direction normal, Direction sun_direction,\n\
-       out IrradianceSpectrum sky_irradiance) {\n\
-      IrradianceSpectrum sun_irradiance = GetSunAndSkyIrradiance(\n\
-          ATMOSPHERE, transmittance_texture, irradiance_texture, p, normal,\n\
-          sun_direction, sky_irradiance);\n\
-      sky_irradiance *= SKY_SPECTRAL_RADIANCE_TO_LUMINANCE;\n\
-      return sun_irradiance * SUN_SPECTRAL_RADIANCE_TO_LUMINANCE;\n\
-    }";
-
-const char header[]="#version 330\n\
-#define IN(x) const in x\n\
-#define OUT(x) out x\n\
-#define TEMPLATE(x)\n\
-#define TEMPLATE_ARGUMENT(x)\n\
-#define assert(x)\n\
-const int TRANSMITTANCE_TEXTURE_WIDTH = 256;\n\
-const int TRANSMITTANCE_TEXTURE_HEIGHT = 64;\n\
-const int SCATTERING_TEXTURE_R_SIZE = 32;\n\
-const int SCATTERING_TEXTURE_MU_SIZE = 128;\n\
-const int SCATTERING_TEXTURE_MU_S_SIZE = 32;\n\
-const int SCATTERING_TEXTURE_NU_SIZE = 8;\n\
-const int IRRADIANCE_TEXTURE_WIDTH = 64;\n\
-const int IRRADIANCE_TEXTURE_HEIGHT = 16;\n\
-#define COMBINED_SCATTERING_TEXTURES\n\
-\n\
-#define Length float\n\
-#define Wavelength float\n\
-#define Angle float\n\
-#define SolidAngle float\n\
-#define Power float\n\
-#define LuminousPower float\n\
-#define Number float\n\
-#define InverseLength float\n\
-#define Area float\n\
-#define Volume float\n\
-#define NumberDensity float\n\
-#define Irradiance float\n\
-#define Radiance float\n\
-#define SpectralPower float\n\
-#define SpectralIrradiance float\n\
-#define SpectralRadiance float\n\
-#define SpectralRadianceDensity float\n\
-#define ScatteringCoefficient float\n\
-#define InverseSolidAngle float\n\
-#define LuminousIntensity float\n\
-#define Luminance float\n\
-#define Illuminance float\n\
-#define AbstractSpectrum vec3\n\
-#define DimensionlessSpectrum vec3\n\
-#define PowerSpectrum vec3\n\
-#define IrradianceSpectrum vec3\n\
-#define RadianceSpectrum vec3\n\
-#define RadianceDensitySpectrum vec3\n\
-#define ScatteringSpectrum vec3\n\
-#define Position vec3\n\
-#define Direction vec3\n\
-#define Luminance3 vec3\n\
-#define Illuminance3 vec3\n\
-#define TransmittanceTexture sampler2D\n\
-#define AbstractScatteringTexture sampler3D\n\
-#define ReducedScatteringTexture sampler3D\n\
-#define ScatteringTexture sampler3D\n\
-#define ScatteringDensityTexture sampler3D\n\
-#define IrradianceTexture sampler2D\n\
-const Length m = 1.0;\n\
-const Wavelength nm = 1.0;\n\
-const Angle rad = 1.0;\n\
-const SolidAngle sr = 1.0;\n\
-const Power watt = 1.0;\n\
-const LuminousPower lm = 1.0;\n\
-const float PI = 3.14159265358979323846;\n\
-const Length km = 1000.0 * m;\n\
-const Area m2 = m * m;\n\
-const Volume m3 = m * m * m;\n\
-const Angle pi = PI * rad;\n\
-const Angle deg = pi / 180.0;\n\
-const Irradiance watt_per_square_meter = watt / m2;\n\
-const Radiance watt_per_square_meter_per_sr = watt / (m2 * sr);\n\
-const SpectralIrradiance watt_per_square_meter_per_nm = watt / (m2 * nm);\n\
-const SpectralRadiance watt_per_square_meter_per_sr_per_nm =\n\
-    watt / (m2 * sr * nm);\n\
-const SpectralRadianceDensity watt_per_cubic_meter_per_sr_per_nm =\n\
-    watt / (m3 * sr * nm);\n\
-const LuminousIntensity cd = lm / sr;\n\
-const LuminousIntensity kcd = 1000.0 * cd;\n\
-const Luminance cd_per_square_meter = cd / m2;\n\
-const Luminance kcd_per_square_meter = kcd / m2;\n\
-struct DensityProfileLayer {\n\
-  Length width;\n\
-  Number exp_term;\n\
-  InverseLength exp_scale;\n\
-  InverseLength linear_term;\n\
-  Number constant_term;\n\
-};\n\
-struct DensityProfile {\n\
-  DensityProfileLayer layers[2];\n\
-};\n\
-struct AtmosphereParameters {\n\
-  IrradianceSpectrum solar_irradiance;\n\
-  Angle sun_angular_radius;\n\
-  Length bottom_radius;\n\
-  Length top_radius;\n\
-  DensityProfile rayleigh_density;\n\
-  ScatteringSpectrum rayleigh_scattering;\n\
-  DensityProfile mie_density;\n\
-  ScatteringSpectrum mie_scattering;\n\
-  ScatteringSpectrum mie_extinction;\n\
-  Number mie_phase_function_g;\n\
-  DensityProfile absorption_density;\n\
-  ScatteringSpectrum absorption_extinction;\n\
-  DimensionlessSpectrum ground_albedo;\n\
-  Number mu_s_min;\n\
-};\n\
-const AtmosphereParameters ATMOSPHERE = AtmosphereParameters(\n\
-vec3(1.474000,1.850400,1.911980),\n\
-0.004675,\n\
-6360.000000,\n\
-6420.000000,\n\
-DensityProfile(DensityProfileLayer[2](DensityProfileLayer(0.000000,0.000000,0.000000,0.000000,0.000000),DensityProfileLayer(0.000000,1.000000,-0.125000,0.000000,0.000000))),\n\
-vec3(0.005802,0.013558,0.033100),\n\
-DensityProfile(DensityProfileLayer[2](DensityProfileLayer(0.000000,0.000000,0.000000,0.000000,0.000000),DensityProfileLayer(0.000000,1.000000,-0.833333,0.000000,0.000000))),\n\
-vec3(0.003996,0.003996,0.003996),\n\
-vec3(0.004440,0.004440,0.004440),\n\
-0.800000,\n\
-DensityProfile(DensityProfileLayer[2](DensityProfileLayer(25.000000,0.000000,0.000000,0.066667,-0.666667),DensityProfileLayer(0.000000,0.000000,0.000000,-0.066667,2.666667))),\n\
-vec3(0.000650,0.001881,0.000085),\n\
-vec3(0.100000,0.100000,0.100000),\n\
--0.207912);\n\
-const vec3 SKY_SPECTRAL_RADIANCE_TO_LUMINANCE = vec3(683.000000,683.000000,683.000000);\n\
-const vec3 SUN_SPECTRAL_RADIANCE_TO_LUMINANCE = vec3(98242.786222,69954.398112,66475.012354);\n\
-";
-
-void tns_InitAtmosphere(){
-    laSafeString* ss=0;
-
-    tnsTexture* transmittance_texture_ = tnsCreate2DTexture(GL_RGBA32F, TRANSMITTANCE_TEXTURE_WIDTH, TRANSMITTANCE_TEXTURE_HEIGHT, 0);
-    tnsTexture* scattering_texture_ = tnsCreate3DTexture(GL_RGBA16F, SCATTERING_TEXTURE_WIDTH, SCATTERING_TEXTURE_HEIGHT,SCATTERING_TEXTURE_DEPTH);
-    tnsTexture* irradiance_texture_ = tnsCreate2DTexture(GL_RGBA32F, IRRADIANCE_TEXTURE_WIDTH, IRRADIANCE_TEXTURE_HEIGHT, 0);
-    
-    tnsTexture* delta_irradiance_texture = tnsCreate2DTexture(GL_RGBA32F, IRRADIANCE_TEXTURE_WIDTH, IRRADIANCE_TEXTURE_HEIGHT, 0);
-    tnsTexture* delta_rayleigh_scattering_texture = tnsCreate3DTexture(GL_RGBA16F, SCATTERING_TEXTURE_WIDTH, SCATTERING_TEXTURE_HEIGHT,SCATTERING_TEXTURE_DEPTH);
-    tnsTexture* delta_mie_scattering_texture = tnsCreate3DTexture(GL_RGBA16F, SCATTERING_TEXTURE_WIDTH, SCATTERING_TEXTURE_HEIGHT,SCATTERING_TEXTURE_DEPTH);
-    tnsTexture* delta_scattering_density_texture =tnsCreate3DTexture(GL_RGBA16F, SCATTERING_TEXTURE_WIDTH, SCATTERING_TEXTURE_HEIGHT,SCATTERING_TEXTURE_DEPTH);
-    tnsTexture* delta_multiple_scattering_texture = delta_rayleigh_scattering_texture;
-
-    GLuint fbo;
-    glGenFramebuffers(1, &fbo);
-    glBindFramebuffer(GL_FRAMEBUFFER, fbo);
-
-    // The actual precomputations depend on whether we want to store precomputed
-    // irradiance or illuminance values.
-    //if (num_precomputed_wavelengths_ <= 3) {
-    //    vec3 lambdas{kLambdaR, kLambdaG, kLambdaB};
-    //    mat3 luminance_from_radiance{1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0};
-    //    Precompute(fbo, delta_irradiance_texture, delta_rayleigh_scattering_texture,
-    //        delta_mie_scattering_texture, delta_scattering_density_texture,
-    //        delta_multiple_scattering_texture, lambdas, luminance_from_radiance,
-    //        false /* blend */, num_scattering_orders);
-    //} else {
-    //    constexpr double kLambdaMin = 360.0;
-    //    constexpr double kLambdaMax = 830.0;
-    //    int num_iterations = (num_precomputed_wavelengths_ + 2) / 3;
-    //    double dlambda = (kLambdaMax - kLambdaMin) / (3 * num_iterations);
-    //    for (int i = 0; i < num_iterations; ++i) {
-    //    vec3 lambdas{
-    //        kLambdaMin + (3 * i + 0.5) * dlambda,
-    //        kLambdaMin + (3 * i + 1.5) * dlambda,
-    //        kLambdaMin + (3 * i + 2.5) * dlambda
-    //    };
-    //    auto coeff = [dlambda](double lambda, int component) {
-    //        // Note that we don't include MAX_LUMINOUS_EFFICACY here, to avoid
-    //        // artefacts due to too large values when using half precision on GPU.
-    //        // We add this term back in kAtmosphereShader, via
-    //        // SKY_SPECTRAL_RADIANCE_TO_LUMINANCE (see also the comments in the
-    //        // Model constructor).
-    //        double x = CieColorMatchingFunctionTableValue(lambda, 1);
-    //        double y = CieColorMatchingFunctionTableValue(lambda, 2);
-    //        double z = CieColorMatchingFunctionTableValue(lambda, 3);
-    //        return static_cast<float>((
-    //            XYZ_TO_SRGB[component * 3] * x +
-    //            XYZ_TO_SRGB[component * 3 + 1] * y +
-    //            XYZ_TO_SRGB[component * 3 + 2] * z) * dlambda);
-    //    };
-    //    mat3 luminance_from_radiance{
-    //        coeff(lambdas[0], 0), coeff(lambdas[1], 0), coeff(lambdas[2], 0),
-    //        coeff(lambdas[0], 1), coeff(lambdas[1], 1), coeff(lambdas[2], 1),
-    //        coeff(lambdas[0], 2), coeff(lambdas[1], 2), coeff(lambdas[2], 2)
-    //    };
-    //    Precompute(fbo, delta_irradiance_texture,
-    //        delta_rayleigh_scattering_texture, delta_mie_scattering_texture,
-    //        delta_scattering_density_texture, delta_multiple_scattering_texture,
-    //        lambdas, luminance_from_radiance, i > 0 /* blend */,
-    //        num_scattering_orders);
-    //    }
-//
-    //    // After the above iterations, the transmittance texture contains the
-    //    // transmittance for the 3 wavelengths used at the last iteration. But we
-    //    // want the transmittance at kLambdaR, kLambdaG, kLambdaB instead, so we
-    //    // must recompute it here for these 3 wavelengths:
-    //    std::string header = glsl_header_factory_({kLambdaR, kLambdaG, kLambdaB});
-    //    Program compute_transmittance(
-    //        kVertexShader, header + kComputeTransmittanceShader);
-    //    glFramebufferTexture(
-    //        GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, transmittance_texture_, 0);
-    //    glDrawBuffer(GL_COLOR_ATTACHMENT0);
-    //    glViewport(0, 0, TRANSMITTANCE_TEXTURE_WIDTH, TRANSMITTANCE_TEXTURE_HEIGHT);
-    //    compute_transmittance.Use();
-    //    DrawQuad({}, full_screen_quad_vao_);
-    //}
-
-    // Delete the temporary resources allocated at the begining of this method.
-    glUseProgram(0);
-    glBindFramebuffer(GL_FRAMEBUFFER, 0);
-    glDeleteFramebuffers(1, &fbo);
-    glDeleteTextures(1, &delta_scattering_density_texture);
-    glDeleteTextures(1, &delta_mie_scattering_texture);
-    glDeleteTextures(1, &delta_rayleigh_scattering_texture);
-    glDeleteTextures(1, &delta_irradiance_texture);
-    assert(glGetError() == 0);
-
-    strSafeDestroy(&ss);  strSafePrint(&ss,"%s%s",header,kComputeTransmittanceShader);
-    tnsShader* compute_transmittance=tnsNewShaderProgram(tnsNewVertexShader(kVertexShader),tnsNewFragmentShader(ss->Ptr),-1);
-    strSafeDestroy(&ss); strSafePrint(&ss,"%s%s",header,kComputeDirectIrradianceShader);
-    tnsShader* compute_direct_irradiance=tnsNewShaderProgram(tnsNewVertexShader(kVertexShader),tnsNewFragmentShader(ss->Ptr),-1);
-    strSafeDestroy(&ss); strSafePrint(&ss,"%s%s",header,kComputeSingleScatteringShader);
-    tnsShader* compute_single_scattering=tnsNewShaderProgram(tnsNewVertexShader(kVertexShader),tnsNewFragmentShader(ss->Ptr),tnsNewGeometryShader(kGeometryShader));
-    strSafeDestroy(&ss); strSafePrint(&ss,"%s%s",header,kComputeScatteringDensityShader);
-    tnsShader* compute_scattering_density=tnsNewShaderProgram(tnsNewVertexShader(kVertexShader),tnsNewFragmentShader(ss->Ptr),tnsNewGeometryShader(kGeometryShader));
-    strSafeDestroy(&ss); strSafePrint(&ss,"%s%s",header,kComputeIndirectIrradianceShader);
-    tnsShader* compute_indirect_irradiance=tnsNewShaderProgram(tnsNewVertexShader(kVertexShader),tnsNewFragmentShader(ss->Ptr),-1);
-    strSafeDestroy(&ss); strSafePrint(&ss,"%s%s",header,kComputeMultipleScatteringShader);
-    tnsShader* compute_multiple_scattering=tnsNewShaderProgram(tnsNewVertexShader(kVertexShader),tnsNewFragmentShader(ss->Ptr),tnsNewGeometryShader(kGeometryShader));
-
-    const GLuint kDrawBuffers[4] = {
-        GL_COLOR_ATTACHMENT0,
-        GL_COLOR_ATTACHMENT1,
-        GL_COLOR_ATTACHMENT2,
-        GL_COLOR_ATTACHMENT3
-    };
-    glBlendEquationSeparate(GL_FUNC_ADD, GL_FUNC_ADD);
-    glBlendFuncSeparate(GL_ONE, GL_ONE, GL_ONE, GL_ONE);;
-
-}

+ 312 - 0
resources/la_tns_shaders.cpp

@@ -17,6 +17,7 @@
 */
 
 #include "la_5.h"
+
 extern "C" const char* TNS_SHADER_COLOR_COMMON=R"(
 #define M_PI 3.1415926535897932384626433832795
 float cbrt( float x ){
@@ -528,3 +529,314 @@ vec3 XYZ2Clay(vec3 xyz){
 	return xyz*mat;
 }
 )";
+
+
+extern "C" const char* TNS_VERTEX_SIMPLE_MATCAP = R"(#version 330
+uniform mat4 mProjection;
+uniform mat4 mModel;
+uniform mat4 mView;
+
+in vec4 vVertex;
+in vec3 vNormal;
+smooth out vec3 fNormal;
+
+void main(){
+    gl_Position = mProjection * mView  * mModel * vVertex;
+    vec3 N = ( mView * mModel * vec4(vNormal,0)).xyz;
+    fNormal = normalize(N);
+})";
+
+extern "C" const char* TNS_FRAGMENT_SIMPLE_MATCAP = R"(#version 330
+smooth in vec3 fNormal;
+float Interpolate(float between1,float between2,float value1,float value2,float key){
+    float i = (key-between1)/(between2-between1);
+    return value1*(1-i)+value2*i;
+}
+void main(){
+    float value = dot(vec3(0,0,1),fNormal);
+    if(value<0.65) value=0.15;
+    else if(value>=0.65 && value<0.85) value=Interpolate(0.65,0.85,0.15,0.75,value);
+    else if(value>=0.85 && value<0.95) value=0.75;
+    else if(value>=0.95) value=0.9;
+    gl_FragColor = vec4(vec3(0.84, 0.41, 0.16)*value,1);
+})";
+
+extern "C" const char* TNS_VERTEX_GRID = R"(#version 330
+
+uniform mat4 mProjection;
+uniform mat4 mModel;
+uniform mat4 mView;
+
+in vec4 vVertex;
+in vec4 vColor;
+in vec2 vUV;
+out vec4 fColor;
+out vec2 uv;
+
+void main(){
+    vec4 pos = mProjection * mView * mModel * vVertex;
+    gl_Position = pos;
+    fColor = vColor;
+    uv = vUV;
+})";
+
+extern "C" const char* TNS_FRAGMENT_TRANSPARNT_GRID = R"(#version 330
+
+in vec4 fColor;
+in vec2 uv;
+
+void main(){
+    vec4 c = fColor;
+    c.a = sin(uv.x)*sin(uv.y)>0?c.a:0;
+    gl_FragColor = c;
+})";
+
+extern "C" const char* LA_IMM_VERTEX_SHADER = R"(#version 330
+uniform mat4 mProjection;\
+uniform mat4 mModel;\
+uniform mat4 mView;\
+in vec4 vVertex;\
+in vec4 vColor;\
+in vec3 vNormal;\
+in vec2 vUV;\
+out vec4 fColor;\
+out vec2 fUV;\
+flat out vec3 fNormal;\
+out vec3 fGPos;\
+void main(){\
+    gl_Position = mProjection * mView * mModel * vVertex;\
+    fColor = vColor;\
+    fUV=vUV;\
+    fGPos=vec3((mModel * vVertex).xyz);\
+    fNormal= (mModel * vec4(vNormal,0.)).xyz;\
+})";
+
+extern "C" const char* LA_IMM_FRAGMENT_SHADER = R"(#version 330
+uniform sampler2D TexColor;\
+uniform sampler2DMS TexColorMS;\
+uniform int TextureMode;
+uniform int ColorMode;
+uniform int MultiplyColor;
+uniform int SampleAmount;
+uniform int UseNormal;
+uniform int InputColorSpace;
+uniform int OutputColorSpace;
+uniform int ShowStripes;
+uniform float HCYGamma;
+uniform vec3 uViewPos;
+in vec4 fColor;
+in vec2 fUV;
+flat in vec3 fNormal;
+in vec3 fGPos;
+layout(location = 0) out vec4 outColor;
+layout(location = 1) out vec3 outNormal;
+layout(location = 2) out vec3 outGPos;
+#with TNS_SHADER_COLOR_COMMON
+vec3 ConvertColorSpace(vec3 color){
+    if(InputColorSpace!=OutputColorSpace){
+        if(ColorMode==0){
+            if(InputColorSpace==0) color=to_linear_srgb(color);
+            else if(InputColorSpace==1) color=to_linear_clay(color);
+        } 
+        vec3 xyz; if(ColorMode==1){ color.y=pow(color.y,max(HCYGamma,1)); color=okhsl_to_linear_srgb(color); }
+        if(InputColorSpace==1){ xyz=Clay2XYZ(color); }
+        if(InputColorSpace==0){ xyz=sRGB2XYZ(color); }
+        if(OutputColorSpace==0){ color=to_log_srgb(XYZ2sRGB(xyz)); }
+        if(OutputColorSpace==1){ color=to_log_clay(XYZ2Clay(xyz)); }
+    }else{
+        if(ColorMode==1){ color.y=pow(color.y,max(HCYGamma,1)); color=okhsl_to_srgb(color); }
+        else if(ColorMode==0){ color=color; }
+        else{
+            if(OutputColorSpace==0){ color=to_log_srgb(color); }
+            if(OutputColorSpace==1){ color=to_log_clay(color); }
+        }
+    }
+    if(ShowStripes!=0){
+        if(color.r>1.00001||color.g>1.00001||color.b>1.00001||color.r<0||color.g<0||color.b<0){ color=mix(color,vec3(0.5,0.5,0.5),(sin((gl_FragCoord.x+gl_FragCoord.y)/2)>0)?1:0.5); }
+    }
+    return color;
+}
+void main(){
+    vec4 color=vec4(1,0,1,1);
+    if(TextureMode==0){ color = fColor;}
+    else if(TextureMode==1){color = vec4(fColor.rgb,fColor.a*texture2D(TexColor,fUV.st).r);}
+    else if(TextureMode==2){
+        color=texture2D(TexColor,fUV.st);
+        if(MultiplyColor!=0){color*=fColor;}
+    }else if(TextureMode==3){
+        color=vec4(0,0,0,0);
+        ivec2 texSize = textureSize(TexColorMS);
+        for(int i=0;i<SampleAmount;i++) color+=texelFetch(TexColorMS, ivec2(fUV * texSize),i);
+        color/=SampleAmount;
+        if(MultiplyColor!=0){color*=fColor;}
+    }
+    if(UseNormal!=0){
+        float light_factor=dot(fNormal,vec3(0,0,1));
+        float view=dot(fNormal,fGPos-uViewPos);
+        float factor=abs(light_factor);
+        if(light_factor*view>0){ factor=0; }
+        color=vec4(color.rgb*mix(0.2,1.,factor),color.a);
+        vec3 oNormal=fNormal; if(view<0){ oNormal=-fNormal; }
+        outNormal = oNormal;
+    }
+    color=vec4(ConvertColorSpace(color.rgb),color.a); color.a=clamp(color.a,0,1);
+    outColor = color; 
+    outGPos = fGPos;
+})";
+
+extern "C" const char* LA_RAY_VERTEX_SHADER = R"(#version 330
+in vec3 vUV;
+in vec4 vVertex;
+out vec3 fViewDir;
+void main(){
+    gl_Position=vVertex;
+    fViewDir = vUV;
+})";
+
+extern "C" const char* LA_SHADER_LIB_FXAA = R"(
+#define DIFF_LUM_ABS_HOLD 0.0833 
+#define DIFF_LUM_RES_HOLD 0.166
+float luminance(vec3 col) {
+    return dot(col, vec3(0.2126729f,  0.7151522f, 0.0721750f));
+}
+vec4 fxaa(in sampler2D tex, vec2 uv, vec2 texsize) {
+    vec3 e = vec3(-1., 1., 0.);
+    vec2 offuv = uv;
+	vec3 colnw = texture(tex, uv + e.xy / texsize).rgb;
+    vec3 coln  = texture(tex, uv + e.zy / texsize).rgb;
+    vec3 colne = texture(tex, uv + e.yy / texsize).rgb;
+    vec3 colw  = texture(tex, uv + e.xz / texsize).rgb;
+    vec4 colm4  = texture(tex, uv + e.zz / texsize);
+    vec3 colm  = colm4.rgb;
+    vec3 cole  = texture(tex, uv + e.yz / texsize).rgb;
+    vec3 colsw = texture(tex, uv + e.xx / texsize).rgb;
+    vec3 cols  = texture(tex, uv + e.zx / texsize).rgb;
+    vec3 colse = texture(tex, uv + e.yx / texsize).rgb;
+    float lnw = luminance(colnw), ln = luminance(coln), lne = luminance(colne),
+          lw  = luminance(colw),  lm = luminance(colm), le  = luminance(cole),
+          lsw = luminance(colsw), ls = luminance(cols), lse = luminance(colse);
+    float maxl = max(ln, max(ls, max(lw, max(le, lm))));
+    float minl = min(ln, min(ls, min(lw, min(le, lm))));
+    float diff = maxl - minl;
+    if (diff < max(DIFF_LUM_ABS_HOLD, DIFF_LUM_RES_HOLD * maxl)) return colm4;
+    float filterfactor = 0.;
+    filterfactor += 2. * (ln + lw + ls + le) + lnw + lne + lsw + lse;
+    filterfactor /= 12.;
+    filterfactor = abs(filterfactor - lm);
+    filterfactor = clamp(filterfactor / diff, 0., 1.);
+    float blend = smoothstep(0., 1., filterfactor);
+    blend *= blend;
+    float hedge = 2.*(ln + ls - 2.*lm) + (lne + lse - 2.*le) + (lnw + lsw - 2.*lw);
+    float vedge = 2.*(le + lw - 2.*lm) + (lne + lnw - 2.*ln) + (lse + lsw - 2.*ls);
+    float ish = step(vedge, hedge);
+    float psoff = ish >= 1.0 ? 1./texsize.y : 1./texsize.x;
+    float pleft = ish >= 1.0 ? ln : le;
+    float pright = ish >= 1.0 ? ls : lw;
+    if (abs(pleft - lm) < abs(pright - lm)) psoff = -psoff;
+    if (ish >= 1.0) { offuv.y += psoff * blend; }else{ offuv.x += psoff * blend; }
+    return vec4(texture(tex, offuv).rgb,colm4.a);  
+})";
+
+extern "C" const char* LA_RAY_FRAGMENT_SHADER = R"(#version 330
+uniform vec3 uViewDir;
+uniform vec3 uViewPos;
+uniform float uFOV;
+in vec3 fViewDir;
+uniform sampler2D TexColor;
+uniform sampler2D TexNormal;
+uniform sampler2D TexGPos;
+#with LA_SHADER_LIB_FXAA
+void main(){
+    float d=dot(uViewDir,normalize(fViewDir));
+    float target=cos(uFOV/2.);
+    vec4 color=vec4(1.,1.,1.,1.); float mul=0.;
+    //if(d<(target+0.005)&&d>target) mul=1.0;
+    vec2 uv=gl_FragCoord.xy/textureSize(TexColor,0);
+    vec4 buffer_color=fxaa(TexColor,uv,textureSize(TexColor,0));
+    //vec4 buffer_color=texture2D(TexColor,uv);
+    gl_FragColor = mul*color+buffer_color;
+})";
+
+extern "C" const char* LA_SCENE_VERTEX_SHADER = R"(#version 330
+uniform mat4 mProjection;
+uniform mat4 mModel;
+uniform mat4 mView;
+uniform mat4 mShadow;
+in vec4 vVertex;
+in vec4 vColor;
+in vec4 vNormal;
+in vec2 vUV;
+out vec4 fColor;
+//out vec4 fNormal;
+out vec2 fUV;
+out vec4 fGPos;
+void main(){
+    gl_Position= mProjection * mView * mModel * vVertex;
+    fUV=vUV;
+    //fNormal=vNormal;
+    fColor=vColor;
+    fGPos= mShadow * mModel * vVertex;\
+})";
+
+extern "C" const char* LA_SCENE_FRAGMENT_SHADER = R"(#version 330
+uniform sampler2D TexColor;
+uniform sampler2DMS TexColorMS;\
+uniform int TextureMode;
+uniform int SampleAmount;
+uniform int MultiplyColor;
+in vec4 fColor;
+//in vec4 fNormal;
+in vec2 fUV;
+in vec4 fGPos;
+vec4 GetTexture(vec2 uv){
+    vec4 color=vec4(1,0,1,1);
+    if(TextureMode==1 || TextureMode==2){ return texture2D(TexColor,uv); }
+    else if(TextureMode==3){
+        ivec2 texSize = textureSize(TexColorMS);
+        for(int i=0;i<SampleAmount;i++) color+=texelFetch(TexColorMS, ivec2(fUV * texSize),i);
+        color/=SampleAmount;
+        if(MultiplyColor!=0){color*=fColor;}
+        return color;
+    }
+    else return vec4(1,0,1,1);
+}
+float GetShadow(vec4 GPos){
+    vec3 projCoords = GPos.xyz / GPos.w;
+    projCoords = projCoords * 0.5 + 0.5;
+    float closestDepth = GetTexture(projCoords.xy).r;
+    float currentDepth = projCoords.z;
+    float shadow = currentDepth > (closestDepth+0.001)  ? 0.5 : 1.0;
+    return shadow;
+}
+void main(){
+    gl_FragColor=GetShadow(fGPos)*fColor;
+})";
+
+extern "C" const char* LA_CASCADE_SHADOW_VERTEX_SHADER = R"(#version 330
+in vec4 vVertex;
+uniform mat4 mModel;
+uniform mat4 mShadow;
+void main(){
+    gl_Position=mShadow*mModel*vVertex;
+})";
+
+extern "C" const char* LA_CASCADE_SHADOW_FRAGMENT_SHADER = "#version 330\nvoid main(){gl_FragDepth = gl_FragCoord.z;}";
+
+extern "C" const char* LA_SELECTION_VERTEX_SHADER = R"(#version 330
+in vec4 vVertex;
+in vec3 vColor;
+uniform mat4 mProjection;
+uniform mat4 mModel;
+uniform mat4 mView;
+flat out vec3 fIdColor;
+void main(){
+    gl_Position = mProjection * mView * mModel * vVertex;
+    fIdColor = vColor;
+})";
+
+extern "C" const char* LA_SELECTION_FRAGMENT_SHADER = R"(#version 330
+flat in vec3 fIdColor;
+void main(){
+    gl_FragColor=vec4(fIdColor,1.);
+})";
+