*/}}

la_properties.c 164 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291
  1. /*
  2. * LaGUI: A graphical application framework.
  3. * Copyright (C) 2022-2023 Wu Yiming
  4. *
  5. * This program is free software: you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License as published by
  7. * the Free Software Foundation, either version 3 of the License, or
  8. * (at your option) any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. */
  18. #include "../la_5.h"
  19. extern LA MAIN;
  20. extern struct _tnsMain *T;
  21. void laset_TerminalInput(void* unused, char* content){
  22. if((!content)||(!content[0])){ MAIN.TerminalInput[0]=0; return; }
  23. int len=strlen(content);
  24. if(MAIN.IsTerminalEnter){
  25. if(strSame(content,"clear")){ logClear(); MAIN.TerminalInput[0]=0; return; }
  26. logPrint("%s %s\n",MAIN.TerminalIncomplete?"...":">>>",content);
  27. terLoadLine(content,1);
  28. MAIN.TerminalInput[0]=0; return;
  29. }
  30. strcpy(MAIN.TerminalInput,content);
  31. }
  32. void lareset_Theme(laTheme *th){
  33. laBoxedTheme*bt; while(bt=lstPopItem(&th->BoxedThemes)){ strSafeDestroy(&bt->Name); *bt->BackRef=0; memFree(bt); }
  34. strSafeDestroy(&th->Name);
  35. }
  36. void lapostim_Theme(laTheme *th){
  37. for(laBoxedTheme* bt=th->BoxedThemes.pFirst;bt;bt=bt->Item.pNext){
  38. memAssignRef(bt, &bt->Parent,th);
  39. }
  40. MAIN.CurrentTheme = th;
  41. la_RefreshThemeColor(th);
  42. la_RegenerateWireColors();
  43. laRedrawAllWindows();
  44. }
  45. laTheme* laget_ThemePreviewTheme(void* unused, laTheme* theme){
  46. return theme;
  47. }
  48. void *laget_ActiveTheme(void *unused){ return MAIN.CurrentTheme; }
  49. void laset_ActiveTheme(void* unused, laTheme* t){
  50. if(!t) MAIN.CurrentTheme = MAIN.Themes.pFirst;
  51. else MAIN.CurrentTheme = t;
  52. la_RefreshThemeColor(MAIN.CurrentTheme);
  53. la_RegenerateWireColors();
  54. laRedrawAllWindows();
  55. }
  56. void laset_ThemeName(laTheme *t, char *content){
  57. strSafeSet(&t->Name, content);
  58. char buf[32]; sprintf(buf,"LATHEME_%.22s",content);
  59. laset_InstanceUID(t, buf);
  60. }
  61. void laset_ThemeColor(laTheme* t, real* array){
  62. tnsVectorCopy4d(array,t->Color); la_RefreshThemeColor(t); laRedrawAllWindows();
  63. }
  64. void laset_ThemeColorB(laTheme* t, real* array){
  65. tnsVectorCopy4d(array,t->ColorB); la_RefreshThemeColor(t); laRedrawAllWindows();
  66. }
  67. void laset_ThemeColorC(laTheme* t, real* array){
  68. tnsVectorCopy4d(array,t->ColorC); la_RefreshThemeColor(t); laRedrawAllWindows();
  69. }
  70. void laset_ThemeAccentColor(laTheme* t, real* array){
  71. tnsVectorCopy4d(array,t->AccentColor); la_RefreshThemeColor(t); laRedrawAllWindows();
  72. }
  73. void laset_ThemeWarningColor(laTheme* t, real* array){
  74. tnsVectorCopy4d(array,t->WarningColor); la_RefreshThemeColor(t); laRedrawAllWindows();
  75. }
  76. void laset_ThemeInactiveSaturation(laTheme* t, real a){
  77. t->InactiveSaturation=a; la_RefreshThemeColor(t); laRedrawAllWindows();
  78. }
  79. void laset_ThemeInactiveMix(laTheme* t, real a){
  80. t->InactiveMix=a; la_RefreshThemeColor(t); laRedrawAllWindows();
  81. }
  82. void laset_ThemeCursorAlpha(laTheme* t, real a){
  83. t->CursorAlpha=a; la_RefreshThemeColorSelf(t); laRedrawAllWindows();
  84. }
  85. void laset_ThemeSelectionAlpha(laTheme* t, real a){
  86. t->SelectionAlpha=a; la_RefreshThemeColorSelf(t); laRedrawAllWindows();
  87. }
  88. void laset_ThemeShadowAlpha(laTheme* t, real a){
  89. t->ShadowAlpha=a; la_RefreshThemeColorSelf(t); laRedrawAllWindows();
  90. }
  91. void laset_ThemeTextShadowAlpha(laTheme* t, real a){
  92. t->TextShadowAlpha=a; la_RefreshThemeColorSelf(t); laRedrawAllWindows();
  93. }
  94. void laset_ThemeNormal(laBoxedTheme* bt, real val){
  95. bt->NormalY=val; la_RefreshBoxedThemeColor(bt); laRedrawAllWindows();
  96. }
  97. void laset_ThemeActive(laBoxedTheme* bt, real val){
  98. bt->ActiveY=val; la_RefreshBoxedThemeColor(bt); laRedrawAllWindows();
  99. }
  100. void laset_ThemeBorder(laBoxedTheme* bt, real val){
  101. bt->BorderY=val; la_RefreshBoxedThemeColor(bt); laRedrawAllWindows();
  102. }
  103. void laset_ThemeText(laBoxedTheme* bt, real val){
  104. bt->TextY=val; la_RefreshBoxedThemeColor(bt); laRedrawAllWindows();
  105. }
  106. void laset_ThemeTextActive(laBoxedTheme* bt, real val){
  107. bt->TextActiveY=val; la_RefreshBoxedThemeColor(bt); laRedrawAllWindows();
  108. }
  109. void laset_ThemeAlpha(laBoxedTheme* bt, real val){
  110. bt->Alpha=val; la_RefreshBoxedThemeColor(bt); laRedrawAllWindows();
  111. }
  112. void laset_ThemeBoxStyle(laBoxedTheme* bt, int val){
  113. bt->BoxStyle=val; la_RefreshBoxedThemeColor(bt); laRedrawAllWindows();
  114. }
  115. void laset_ThemeTextShadow(laBoxedTheme* bt, int val){
  116. bt->TextShadow=val; la_RefreshBoxedThemeColor(bt); laRedrawAllWindows();
  117. }
  118. void laset_ThemeColorSelection(laBoxedTheme* bt, int val){
  119. bt->ColorSelection=val; la_RefreshBoxedThemeColor(bt); laRedrawAllWindows();
  120. }
  121. void laset_ThemeNoDecalInvert(laBoxedTheme* bt, int val){
  122. bt->NoDecalInvert=val; la_RefreshBoxedThemeColor(bt); laRedrawAllWindows();
  123. }
  124. void laset_ThemeWireTransparency(laTheme* t, real val){ t->WireTransparency = val; la_RegenerateWireColors(); laRedrawAllWindows(); }
  125. void laset_ThemeWireBrightness(laTheme* t, real val){ t->WireBrightness = val; la_RegenerateWireColors(); laRedrawAllWindows(); }
  126. void laset_ThemeWireSaturation(laTheme* t, real val){ t->WireSaturation = val; la_RegenerateWireColors(); laRedrawAllWindows(); }
  127. void laset_ThemeEdgeTransparency(laTheme* t, real val){ t->EdgeTransparency = val; la_RefreshThemeColorSelf(t); laRedrawAllWindows(); }
  128. void laset_ThemeEdgeBrightness(laTheme* t, real val){ t->EdgeBrightness = val; la_RefreshThemeColorSelf(t); laRedrawAllWindows(); }
  129. void laset_ThemeVertexTransparency(laTheme* t, real val){ t->VertexTransparency = val; la_RefreshThemeColorSelf(t); laRedrawAllWindows(); }
  130. void laset_ThemeVertexBrightness(laTheme* t, real val){ t->VertexBrightness = val; la_RefreshThemeColorSelf(t); laRedrawAllWindows(); }
  131. void laset_ThemeSVertexTransparency(laTheme* t, real val){ t->SelectedVertexTransparency = val; la_RefreshThemeColorSelf(t); laRedrawAllWindows(); }
  132. void laset_ThemeSEdgeTransparency(laTheme* t, real val){ t->SelectedEdgeTransparency = val; la_RefreshThemeColorSelf(t); laRedrawAllWindows(); }
  133. void laset_ThemeSFaceTransparency(laTheme* t, real val){ t->SelectedFaceTransparency = val; la_RefreshThemeColorSelf(t); laRedrawAllWindows(); }
  134. void laread_UsingTheme(void* unused, char* name){ laTheme* t=laGetTheme(name); if(t){ laset_ActiveTheme(0,t); } }
  135. void laget_UsingTheme(void* unused, char* result, char**result_direct){ laTheme* t=laget_ActiveTheme(0);
  136. if(t&&t->Name&&t->Name->Ptr){ *result_direct=t->Name->Ptr; return; } *result_direct="NOT FOUND";
  137. }
  138. void laset_WireColorSlices(void* unused, int val){ MAIN.WireColorSlices = val; la_RegenerateWireColors(); laRedrawAllWindows(); }
  139. void laset_WireThickness(void* unused, real val){ MAIN.WireThickness = val;laRedrawAllWindows(); }
  140. void laset_WireSaggyness(void* unused, real val){ MAIN.WireSaggyness = val; laRedrawAllWindows(); }
  141. void* laget_DetachedControllerFirst(void* unused,void* unused2){
  142. return MAIN.Controllers.pFirst;
  143. }
  144. extern tnsFontManager* FM;
  145. void laset_UiRowHeight(void* unused, int val){
  146. MAIN.UiRowHeight = val;
  147. MAIN.ScaledUiRowHeight = MAIN.UiRowHeight;
  148. MAIN.ScaledMargin = MAIN.ScaledUiRowHeight*MAIN.MarginSize*0.1f;
  149. la_RefreshThemeColor(MAIN.CurrentTheme);
  150. tfntResizeFontTexture(FM->UsingFont, TNS_FONT_BUFFER_W_DEFAULT);
  151. tnsInvalidateFontCache();
  152. laRedrawAllWindows();
  153. }
  154. void laset_FontSize(void* unused, real val){
  155. MAIN.FontSize = val;
  156. MAIN.ScaledUiRowHeight=MAIN.UiRowHeight;
  157. MAIN.ScaledMargin = MAIN.ScaledUiRowHeight*MAIN.MarginSize*0.1f;
  158. tnsInvalidateFontCache();
  159. tfntResizeFontTexture(FM->UsingFont, TNS_FONT_BUFFER_W_DEFAULT);
  160. laRedrawAllWindows();
  161. }
  162. void laset_MarginSize(void* unused, real val){
  163. MAIN.MarginSize = val;
  164. MAIN.ScaledMargin = MAIN.ScaledUiRowHeight*MAIN.MarginSize*0.1f;
  165. la_RefreshThemeColor(MAIN.CurrentTheme);
  166. laRedrawAllWindows();
  167. }
  168. void laset_ResourcePath(laResourceFolder *rf, char *content){
  169. strSafeSet(&rf->Path, content);
  170. laRefreshUDFRegistries();
  171. }
  172. void *laget_Self(void *p, void *UNUSED){
  173. return p;
  174. }
  175. void *laget_ListNext(laListItem *Item, void *UNUSED){
  176. return Item->pNext;
  177. }
  178. void *laget_ListPrev(laListItem *Item, void *UNUSED){
  179. return Item->pPrev;
  180. }
  181. void *laget_List2Next(laListItem2 *Item, void *UNUSED){
  182. return Item->pNext;
  183. }
  184. void *laget_List2Prev(laListItem2 *Item, void *UNUSED){
  185. return Item->pPrev;
  186. }
  187. void *laget_PointerListNext(void *UNUSED, laPropIterator *pi){
  188. pi->Linker = ((laListItemPointer *)pi->Linker)->pNext;
  189. return pi->Linker->p;
  190. }
  191. void *laget_FirstUiItem(laUiList *uil, void *UNUSED){
  192. return uil->UiItems.pFirst;
  193. }
  194. void *laget_FirstColumnItem(laUiList *uil, void *UNUSED){
  195. if (!uil) return 0;
  196. return uil->Columns.pFirst;
  197. }
  198. int la_ResetUiColum(laColumn *c, int U, int L, int R, int LR, int repos);
  199. void laset_ColumnSP(laColumn *c, real val){
  200. if (c->LS) c->LS->SP = val;
  201. if (c->RS) c->RS->SP = val;
  202. }
  203. real laget_ColumnSP(laColumn *c){
  204. if (c->LS) return c->LS->SP;
  205. else
  206. return 0.5;
  207. }
  208. void laset_ColumnSnap(laColumn *c, int val){
  209. if (c->LS && c->LS->MaxW) c->LS->MaxW = val;
  210. if (c->RS && c->RS->MaxW) c->RS->MaxW = val;
  211. }
  212. int laget_ColumnSnap(laColumn *c){
  213. if (c->LS && c->LS->MaxW) return c->LS->MaxW;
  214. if (c->RS && c->RS->MaxW) return c->RS->MaxW;
  215. return 20;
  216. }
  217. void laset_SnapState(laColumn *c, int val){
  218. if (val == 1){
  219. if (c->LS) c->LS->MaxW = 20;
  220. if (c->RS) c->RS->MaxW = 0;
  221. }elif (val == 2){
  222. if (c->LS) c->LS->MaxW = 0;
  223. if (c->RS) c->RS->MaxW = 20;
  224. }else{
  225. if (c->LS) c->LS->MaxW = 0;
  226. if (c->RS) c->RS->MaxW = 0;
  227. }
  228. }
  229. int laget_SnapState(laColumn *c){
  230. if (c->LS && c->LS->MaxW) return 1;
  231. if (c->RS && c->RS->MaxW) return 2;
  232. return 0;
  233. }
  234. void *laget_BoxedTheme(laTheme *theme){
  235. return theme->BoxedThemes.pFirst;
  236. }
  237. void *laget_BoxedThemeUi(void *UNUSED){
  238. return ((laTheme *)MAIN.Themes.pFirst)->BoxedThemes.pFirst;
  239. }
  240. void* laget_Main(void *UNUSED, void* UNUSED2){
  241. return &MAIN;
  242. }
  243. laPropContainer* laget_PropertyNodeType(laProp* p){
  244. static laPropContainer* pc=0;
  245. static laPropContainer* ipc=0;
  246. static laPropContainer* fpc=0;
  247. switch(p->PropertyType&(~LA_PROP_ARRAY)){
  248. case LA_PROP_INT: { if(!ipc) ipc=la_ContainerLookup("int_property"); return ipc; }
  249. case LA_PROP_FLOAT: { if(!fpc) fpc=la_ContainerLookup("float_property"); return fpc; }
  250. default: { if(!pc) pc=la_ContainerLookup("property_item"); return pc; }
  251. }
  252. }
  253. void *laget_PropertyItemFirst(laPropContainer *p){
  254. if (!p) return 0;
  255. return p->Props.pFirst;
  256. }
  257. void *laget_PropertyItemNext(laProp *p, void *UNUSED){
  258. return p->Item.pNext;
  259. }
  260. void laget_PropertyName(laProp *p, char *result,char** result_direct){
  261. strCopyFull(result, p ? p->Name : "");
  262. }
  263. void laget_PropertyIdentifier(laProp *p, char *result,char** result_direct){
  264. strCopyFull(result, p ? p->Identifier : "");
  265. }
  266. void laget_PropertyDescription(laProp *p, char *result,char** result_direct){
  267. strCopyFull(result, p ? p->Description : "");
  268. }
  269. int laget_PropertySubContainerIconID(laProp *p){
  270. if (p->PropertyType != LA_PROP_SUB) return 0;
  271. if (!p->SubProp){
  272. p->SubProp = la_ContainerLookup(((laSubProp *)p)->TargetID);
  273. if (!p->SubProp) return 0;
  274. }
  275. return p->SubProp->IconID;
  276. }
  277. void* laget_TrashItemInstance(void *a){
  278. return a;
  279. }
  280. void *laget_ActiveWindow(void *unused){
  281. return MAIN.CurrentWindow;
  282. }
  283. void *laget_FirstWindow(void *unused, void* unused_iter){
  284. return MAIN.Windows.pFirst;
  285. }
  286. void *laget_FirstContainer(void *unused, void* unused_iter){
  287. return MAIN.PropContainers.pFirst;
  288. }
  289. void *laget_WindowFirstLayout(laWindow *window, void* unused_iter){
  290. return window->Layouts.pFirst;
  291. }
  292. void *laget_FirstHiddenPanel(laWindow *window, void* unused_iter){
  293. for(laPanel* p=window->Panels.pFirst;p;p=p->Item.pNext){
  294. if(!p->Show&&!p->LaterDestroy){return p;}
  295. }
  296. return 0;
  297. }
  298. void *laget_NextHiddenPanel(laPanel* p, void* unused_iter){
  299. for(p=p->Item.pNext;p;p=p->Item.pNext){
  300. if(!p->Show&&!p->LaterDestroy){return p;}
  301. }
  302. return 0;
  303. }
  304. void laset_WindowHiddenPanel(laWindow *window, laPanel* p){
  305. laShowPanelWithExpandEffect(p);
  306. laPopPanel(p);
  307. }
  308. void laget_PanelTitle(laPanel *p, char *result,char** result_direct){
  309. strCopyFull(result, p->Title->Ptr);
  310. }
  311. void laset_PanelTitle(laPanel *p, char *content){
  312. strSafeSet(&p->Title, content);
  313. p->TitleWidth = tnsStringGetWidth(transLate(p->Title->Ptr), 0,0);
  314. }
  315. void laread_PanelTitle(laPanel *p, char *content){
  316. strSafeSet(&p->Title, content);
  317. }
  318. void laset_PanelSnapDistance(laPanel *p, int index, int n){
  319. int a;
  320. if (!n) return;
  321. switch (index){ //lrtb
  322. case 0:
  323. p->SL = p->SL ? n : 0;
  324. break;
  325. case 1:
  326. p->SR = p->SR ? n : 0;
  327. break;
  328. case 2:
  329. p->ST = p->ST ? n : 0;
  330. break;
  331. case 3:
  332. p->SB = p->SB ? n : 0;
  333. break;
  334. }
  335. }
  336. void laread_PanelSnapDistance(laPanel* p, int index, int n) {
  337. int a;
  338. if (!n) return;
  339. switch (index) { //lrtb
  340. case 0: p->SL = n; break;
  341. case 1: p->SR = n; break;
  342. case 2: p->ST = n; break;
  343. case 3: p->SB = n; break;
  344. }
  345. }
  346. void laset_PanelSnapEnable(laPanel *p, int index, int n){
  347. laWindow *w = MAIN.CurrentWindow;
  348. int a;
  349. switch (index){ //lrtb
  350. case 0:
  351. p->SL = (n && p->X) ? p->X : 0;
  352. break;
  353. case 1:
  354. p->SR = (n && w ? ((a = MAIN.CurrentWindow->CW - p->X - p->W) ? a : 0) : n);
  355. break;
  356. case 2:
  357. p->ST = (n && p->Y) ? p->Y : 0;
  358. break;
  359. case 3:
  360. p->SB = (n && w ? ((a = MAIN.CurrentWindow->CH - p->Y - p->H) ? a : 0) : n);
  361. break;
  362. }
  363. }
  364. void laget_PanelSnapEnable(laPanel *p, int *result){
  365. result[0] = p->SL ? 1 : 0;
  366. result[1] = p->SR ? 1 : 0;
  367. result[2] = p->ST ? 1 : 0;
  368. result[3] = p->SB ? 1 : 0;
  369. }
  370. void laget_LayoutTitle(laLayout *l, char *result, char** result_direct){
  371. strCopyFull(result, l->ID->Ptr);
  372. }
  373. void laset_LayoutTitle(laLayout *l, char *content){
  374. strSafeSet(&l->ID, content);
  375. laRenameWindow(MAIN.CurrentWindow, SSTR(l->ID));
  376. }
  377. //void* laget_LayoutPanelFirst(laLayout* l) {
  378. // return l->Panels.pFirst;
  379. //}
  380. void laset_WindowActiveLayout(laWindow *w, laLayout *l, int UNUSED_State){
  381. la_StopAllOperators();
  382. memAssignRef(w, &w->CurrentLayout, l);
  383. if(!w->win){return;}
  384. laRenameWindow(w, l->ID->Ptr);
  385. laRedrawCurrentWindow();
  386. }
  387. void* laget_WindowActiveLayout(laWindow *w, void* unused){
  388. return w->CurrentLayout;
  389. }
  390. //void laget_PanelSnappingTrueFalse(laPanel* p, int* result) {
  391. // result[0] = p->SL > 0 ? 1 : 0;
  392. // result[1] = p->SR > 0 ? 1 : 0;
  393. // result[2] = p->ST > 0 ? 1 : 0;
  394. // result[3] = p->SB > 0 ? 1 : 0;
  395. //}
  396. //void laset_PanelSnappingTrueFalse(laPanel* p,int Index, int n) {
  397. // int* v = &p->SL;
  398. // int val = abs(v[Index]);
  399. // v[Index] = val*(n ? 1 : -1);
  400. //}
  401. void laset_PanelMultisample(void* unused, int value){
  402. MAIN.PanelMultisample = value;
  403. tnsReconfigureTextureParameters(value);
  404. laRedrawAllWindows();
  405. }
  406. void *laget_UiInternalType(void *UNUSED){
  407. return MAIN.UiTypes.pFirst;
  408. }
  409. void laget_TimeString(laTimeInfo *ti, char *result,char** result_direct){
  410. sprintf(result, "%d-%.02d-%.02d %.02d:%.02d:%.02d", ti->Year, ti->Month, ti->Day, ti->Hour, ti->Minute, ti->Second);
  411. }
  412. int laget_TimeYear(laTimeInfo *ti){
  413. return (int)ti->Year;
  414. }
  415. int laget_TimeMonth(laTimeInfo *ti){
  416. return (int)ti->Month;
  417. }
  418. int laget_TimeDay(laTimeInfo *ti){
  419. return (int)ti->Day;
  420. }
  421. int laget_TimeHour(laTimeInfo *ti){
  422. return (int)ti->Hour;
  423. }
  424. int laget_TimeMinute(laTimeInfo *ti){
  425. return (int)ti->Minute;
  426. }
  427. int laget_TimeSecond(laTimeInfo *ti){
  428. return (int)ti->Second;
  429. }
  430. void *laget_ConditionerExtra(laUiItem *ui){
  431. if (ui->Type == &_LA_UI_CONDITION ||
  432. ui->Type == &_LA_UI_CONDITION_END ||
  433. ui->Type == &_LA_UI_CONDITION_ELSE ||
  434. ui->Type == _LA_UI_CONDITION_TOGGLE){
  435. return ui->Extra;
  436. }
  437. return 0;
  438. }
  439. void *laget_CanvasExtra(laUiItem *ui){
  440. if (ui->Type == _LA_UI_CANVAS){
  441. return ui->Extra;
  442. }
  443. return 0;
  444. }
  445. void laget_UnknownPropertyString(laUDF *udf, char *result, char** here){
  446. *here="Unknown Property";
  447. }
  448. void laget_MainIdentifier(laUDF *udf, char *result, char** here){
  449. strcpy(result, "MAIN");
  450. }
  451. void laget_UDFFilePath(laUDF *udf, char *result, char** here){
  452. *here=udf->FileName->Ptr;
  453. }
  454. void laset_ManagerFilterInstances(void* unused, int val){
  455. MAIN.ManagerFilterInstances = val;
  456. laRedrawAllWindows();
  457. }
  458. void lapost_PropPack(laPropPack *pp);
  459. void laget_ConditionNodePropPath(laUiConditionNode *ucn, char *result, char** here){
  460. if (!ucn->PP.Go) return;
  461. la_GetPropPackPath(&ucn->PP, result);
  462. }
  463. void laset_ConditionNodePropPath(laUiConditionNode *ucn, char *content, char** here){
  464. if (ucn->PP.Go){
  465. la_FreePropStepCache(ucn->PP.Go);
  466. ucn->PP.LastPs = ucn->PP.Go = 0;
  467. }
  468. la_GetPropFromPath(&ucn->PP, ucn->PP.RawThis, content, 0);
  469. }
  470. void laread_ConditionNodePropPath(laUiConditionNode *ucn, char *Content, char** here){
  471. if (!Content || !Content[0]) return;
  472. ucn->PP.Go = CreateNewBuffer(char, strlen(Content) + 1);
  473. strcpy(ucn->PP.Go, Content);
  474. }
  475. void lapost_ConditionNode(laUiConditionNode *ucn){
  476. lapost_PropPack(&ucn->PP);
  477. }
  478. void la_ConditionNodeFreeRecursive(laUiConditionNode *ucn);
  479. void laset_ConditionNodeType(laUiConditionNode *ucn, int Type){
  480. ucn->Type = Type;
  481. switch (Type){
  482. case LA_CONDITION_PROP:
  483. case LA_CONDITION_INT:
  484. case LA_CONDITION_FLOAT:
  485. case LA_CONDITION_STRING:
  486. case LA_CONDITION_FALSE:
  487. case LA_CONDITION_TRUE:
  488. la_ConditionNodeFreeRecursive(ucn->Expression1);
  489. la_ConditionNodeFreeRecursive(ucn->Expression2);
  490. ucn->Expression1 = 0;
  491. ucn->Expression2 = 0;
  492. if (ucn->PP.LastPs) la_FreePropStepCache(ucn->PP.Go);
  493. ucn->PP.LastPs = ucn->PP.Go = ucn->PP.RawThis = 0;
  494. break;
  495. case LA_CONDITION_NOT:
  496. la_ConditionNodeFreeRecursive(ucn->Expression2);
  497. ucn->Expression2 = 0;
  498. if (ucn->PP.LastPs) la_FreePropStepCache(ucn->PP.Go);
  499. ucn->PP.LastPs = ucn->PP.Go = ucn->PP.RawThis = 0;
  500. if (!ucn->Expression1) ucn->Expression1 = laIntExpression(0);
  501. break;
  502. default:
  503. if (!ucn->Expression1) ucn->Expression1 = laIntExpression(0);
  504. if (!ucn->Expression2) ucn->Expression2 = laIntExpression(1);
  505. break;
  506. }
  507. laRecalcCurrentPanel();
  508. }
  509. void laread_ConditionNodeType(laUiConditionNode *ucn, int Type){
  510. ucn->Type = Type;
  511. }
  512. void* laget_FirstDriverPage(laRackPageCollection* rpc, void* unused2){
  513. return rpc->Pages.pFirst;
  514. }
  515. void* laget_CurrentRackPage(laRackPageCollection* c){
  516. return c->CurrentPage;
  517. }
  518. void laset_CurrentRackPage(laRackPageCollection* c,laRackPage* rp){
  519. memAssignRef(c,&c->CurrentPage,rp);
  520. }
  521. void* laget_CurrentAnimationAction(void* unused_a){
  522. return MAIN.Animation->CurrentAction;
  523. }
  524. void laset_CurrentAnimationAction(void* unused_a, laAction* c){
  525. memAssignRef(MAIN.Animation,&MAIN.Animation->CurrentAction,c);
  526. laNotifyUsers("la.animation.current_action");
  527. }
  528. void laset_AutoSwitchColorSpace(void* unused, int enabled){
  529. MAIN.AutoSwitchColorSpace = enabled;
  530. if(enabled){
  531. for(laWindow* w=MAIN.Windows.pFirst;w;w=w->Item.pNext){
  532. laScreen* s = laGetWindowScreen(w);
  533. if(s){ w->OutputColorSpace = s->ColorSpace; laNotifyInstanceUsers(w); }
  534. }
  535. }
  536. laNotifyUsers("la.user_preferences.auto_switch_color_space");
  537. }
  538. void laset_ScreenColorSpace(laScreen* s, int space){
  539. s->ColorSpace=space;
  540. if(MAIN.AutoSwitchColorSpace){
  541. for(laWindow* w=MAIN.Windows.pFirst;w;w=w->Item.pNext){
  542. laScreen* s = laGetWindowScreen(w);
  543. if(s){ w->OutputColorSpace = s->ColorSpace; laNotifyInstanceUsers(w); }
  544. }
  545. }
  546. }
  547. void laset_WindowColorSpace(laWindow* w, int space){ w->OutputColorSpace=space; MAIN.LutNeedsRefreshing=1; if(w->win) laRedrawCurrentWindow(); }
  548. void laset_WindowOutputProofing(laWindow* w, int v){ w->OutputProofing=v; MAIN.LutNeedsRefreshing=1; if(w->win) laRedrawCurrentWindow(); }
  549. void laset_WindowShowStripes(laWindow* w, int stripes){ w->OutputShowStripes=stripes; if(w->win) laRedrawCurrentWindow(); }
  550. void laset_WindowUseComposing(laWindow* w, int comp){ w->UseComposing=comp; if(w->win) laRedrawCurrentWindow(); }
  551. void laset_WindowComposingGamma(laWindow* w, real v){ w->ComposingGamma=v; if(w->win) laRedrawCurrentWindow(); }
  552. void laset_WindowComposingBlackpoint(laWindow* w, real v){ w->ComposingBlackpoint=v; if(w->win) laRedrawCurrentWindow(); }
  553. void *tnsget_TnsMain(void *unused,void *unused2){
  554. return T;
  555. }
  556. void *tnsget_World(void *unused,void *unused2){
  557. return T->World;
  558. }
  559. void tnsread_World(void *unused, void *inst){
  560. }
  561. void tnsset_InstancerInstance(tnsInstancer *o, tnsObject* value){
  562. o->Instance=value; tnsInvalidateEvaluation(o); laNotifyUsers("tns.world");
  563. }
  564. void tnsset_InstancerHook(tnsInstancer *o, int Hook){ laNotifyUsers("tns.world");
  565. o->Hook=Hook; laNotifyInstanceUsers(o); tnsInvalidateEvaluation(o); tnsInvalidateEvaluation(o->Instance);
  566. }
  567. void tnssetarr_InstancerHookOffset(tnsInstancer *o, real* arr){ laNotifyUsers("tns.world");
  568. tnsVectorSet2v(o->HookOffset,arr); laNotifyInstanceUsers(o); tnsInvalidateEvaluation(o); tnsInvalidateEvaluation(o->Instance);
  569. }
  570. void *tnsget_detached_FirstRootObject(void *UNUSED1, void *UNUSED2){
  571. return T->World->RootObjects.pFirst;
  572. }
  573. void *tnsget_detached_FirstMaterial(void *UNUSED1, void *UNUSED2){
  574. return T->World->Materials.pFirst;
  575. }
  576. void *tnsget_detached_FirstTexture(void *UNUSED1, void *UNUSED2){
  577. return T->Textures.pFirst;
  578. }
  579. void *tnsget_PreviewTexture(void *UNUSED){
  580. return T->PreviewTexture;
  581. }
  582. void tnsset_PreviewTexture(void *UNUSED_PARENT, void *tex, int UNUSEDSTATE){
  583. T->PreviewTexture = tex;
  584. }
  585. void *tnsget_NextLinkedObject(tnsObject *o, laPropIterator *pi){
  586. pi->Linker = ((laListItemPointer *)pi->Linker->pNext);
  587. return pi->Linker->p;
  588. }
  589. void *tnsget_FirstChildObject(tnsObject *ob){
  590. return ob->ChildObjects.pFirst;
  591. }
  592. void tnsset_RootObjectIs2D(tnsRootObject *root, int Is2D){
  593. root->Is2D=Is2D; laNotifyInstanceUsers(root);
  594. }
  595. void tnsset_ObjectLocation(tnsObject* o, int n, real val){ o->Location[n]=val;tnsSelfTransformValueChanged(o); laNotifyUsers("tns.world"); }
  596. void tnsset_ObjectRotation(tnsObject* o, int n, real val){ o->Rotation[n]=val; tnsSelfTransformValueChanged(o); laNotifyUsers("tns.world"); }
  597. void tnsset_ObjectScale(tnsObject* o, int n, real val){ o->Scale[n]=val; tnsSelfTransformValueChanged(o); laNotifyUsers("tns.world"); }
  598. void tnsset_ObjectDLocationARR(tnsObject* o, real* arr){ tnsVectorCopy3d(arr,o->DLocation); tnsDeltaTransformValueChanged(o); laNotifyUsers("tns.world"); }
  599. void tnsset_ObjectDRotationARR(tnsObject* o, real* arr){ tnsVectorCopy3d(arr,o->DRotation); tnsDeltaTransformValueChanged(o); laNotifyUsers("tns.world"); }
  600. void tnsset_ObjectDScaleARR(tnsObject* o, real* arr){ tnsVectorCopy3d(arr,o->DScale); tnsDeltaTransformValueChanged(o); laNotifyUsers("tns.world"); }
  601. tnsMeshObject* tnsget_ObjectAsMesh(tnsObject* o){ if(!o || o->Type!=TNS_OBJECT_MESH) return 0; return o; }
  602. tnsRootObject* tnsget_ObjectAsRoot(tnsObject* o){ if(!o || o->Type!=TNS_OBJECT_ROOT) return 0; return o; }
  603. void laget_UiTemplateIdentifier(laUiTemplate *uit, char *result, char** here){
  604. *here=uit->Identifier->Ptr;
  605. }
  606. void laset_UiTemplateIdentifier(laUiTemplate *uit, char *content){
  607. strSafeSet(&uit->Identifier, content);
  608. }
  609. void laget_UiDataPath(laUiItem *ui, char *result){
  610. laPropStep *ps = ui->PP.Go;
  611. if (ui->PP.LastPs || ui->PP.Go){
  612. for (ps; ps; ps = ps->pNext){
  613. if (ps->Type == U'@' || ps->Type == U'#' || ps->Type == U'='){
  614. strcat(result, ps->p);
  615. }else{
  616. strcat(result, ps->p->Identifier);
  617. }
  618. if (ps->pNext){
  619. if (ps->pNext->Type == U'.') strcat(result, ".");
  620. elif (ps->pNext->Type == U'#') strcat(result, "#");
  621. elif (ps->pNext->Type == U'@') strcat(result, "@");
  622. elif (ps->pNext->Type == U'=') strcat(result, "= ");
  623. elif (ps->pNext->Type == U'$') strcat(result, "$");
  624. }
  625. }
  626. }elif (ui->AT){
  627. strcpy(result, "");
  628. }
  629. }
  630. void laget_UiOperatorID(laUiItem *ui, char *result, char** here){
  631. if (ui->AT){
  632. *here=ui->AT->Identifier;
  633. }else *result=0;
  634. }
  635. void laread_UiDataPath(laUiItem *ui, char *Content){
  636. if (!Content || !Content[0]) return;
  637. ui->PP.Go = CreateNewBuffer(char, strlen(Content) + 1);
  638. strcpy(ui->PP.Go, Content);
  639. }
  640. void laread_UiOperatorID(laUiItem *ui, char *Content){
  641. ui->AT = laGetOperatorType(Content);
  642. }
  643. void *laget_PanelTemplate(void *UNUSED, void *UNUSED2){
  644. return MAIN.PanelTemplates.pFirst;
  645. }
  646. void laget_PanelTemplateCategory(void* rack_unused, laUiTemplate* uit, char* copy, char** ptr){
  647. if(uit->CategoryName&&uit->CategoryName->Ptr) *ptr=uit->CategoryName->Ptr;
  648. }
  649. void lapost_Window(laWindow *w){
  650. laStartWindow(w);
  651. laDisableIME(w);
  652. }
  653. int la_CreateSystemWindow(laWindow *window, int synctovbank);
  654. void la_AssignWindowPP(laWindow* w);
  655. void lapostim_Window(laWindow *w){
  656. w->IsFullScreen=0;
  657. la_CreateSystemWindow(w,MAIN.Windows.pFirst==MAIN.Windows.pLast);
  658. la_AssignWindowPP(w);
  659. MAIN.CurrentWindow = w;
  660. }
  661. void lapost_PropPack(laPropPack *pp){
  662. char *path = pp->Go;
  663. if (pp->LastPs /* || !path*/) return;
  664. if ((!path || (path && !path[0])) && pp->RawThis) pp->LastPs = pp->RawThis->LastPs;
  665. if (pp->RawThis) lapost_PropPack(pp->RawThis);
  666. pp->Go = 0;
  667. la_GetPropFromPath(pp, pp->RawThis, path, 0);
  668. FreeMem(path);
  669. }
  670. void lapost_UiItem(laUiItem *ui){
  671. lapost_PropPack(&ui->PP);
  672. //if(ui->Type == _LA_UI_CANVAS) ui->Type->Init(ui);
  673. }
  674. void la_AssignPropExtras(laUiItem* ui);
  675. void lapostim_UiItem(laUiItem *ui){
  676. if (ui->Type && ui->Type->Init && ui->Type != _LA_UI_CANVAS && ui->Type != &_LA_UI_CONDITION) ui->Type->Init(ui);
  677. ui->State = ui->State ? ui->State : (ui->Type ? LA_UI_NORMAL : 0);
  678. la_AssignPropExtras(ui);
  679. }
  680. void* laget_SavePanel(laWindow* w, laPropIterator* pi){
  681. for(laPanel* p=w->Panels.pFirst;p;p=p->Item.pNext){ if(!p->Mode || p->IsMenuPanel || p->PanelTemplate) return p; }
  682. return 0;
  683. }
  684. void* lagetnext_SavePanel(laPanel* p, laPropIterator* pi){
  685. for(p=p->Item.pNext;p;p=p->Item.pNext){ if(!p->Mode || p->IsMenuPanel || p->PanelTemplate) return p; }
  686. return 0;
  687. }
  688. void lapost_Panel(laPanel *p){
  689. p->PP.EndInstance = p;
  690. p->PP.LastPs = &p->FakePS;
  691. p->PP.LastPs->p = _LA_PROP_PANEL;
  692. p->PP.LastPs->UseInstance = p;
  693. p->PP.LastPs->Type = U'.';
  694. la_EnsurePanelExtras(p);
  695. laRecalcPanel(p);
  696. p->FrameDistinguish = 100;
  697. if(p->IsMenuPanel || p->Block) p->Show=1;
  698. laUiTemplate* uit=p->PanelTemplate;
  699. if(uit&&uit->PropFunc){ uit->PropFunc(p); }
  700. if(uit){
  701. uit->Define(&p->UI, &p->PP, &p->PropLinkPP, 0, 0);
  702. if(p->Mode) laui_DefaultPanelTitleBar(&p->TitleBar, &p->PP, &p->PropLinkPP, uit->Header);
  703. }
  704. if(p->IsMenuPanel){ laui_DefaultMenuBarActual(&p->TitleBar, &p->PP, &p->PropLinkPP, 0, 0); }
  705. //if(p->Title) p->TitleWidth = tnsStringGetWidth(transLate(p->Title->Ptr), 0, 0);
  706. #ifdef LA_LINUX
  707. XSync(MAIN.dpy,0);
  708. #endif
  709. }
  710. void la_AssignBlockPP(laBlock* b);
  711. void lapost_Block(laBlock *b){
  712. la_AssignBlockPP(b);
  713. }
  714. void lapost_UserPreferences(void* unused){
  715. //MAIN.ScaledUiRowHeight=MAIN.UiRowHeight;
  716. //tnsInvalidateFontCache();
  717. }
  718. void laset_ColorPickerGamma(void* unused, real gamma){
  719. MAIN.ColorPickerGamma=gamma; laRedrawCurrentWindow();
  720. }
  721. void laset_ViewportHalftoneFactor(void* unused, real v){
  722. MAIN.ViewportHalftoneFactor=v; laNotifyUsers("tns.world");
  723. }
  724. void laset_ViewportHalftoneSize(void* unused, real v){
  725. MAIN.ViewportHalftoneSize=v; laNotifyUsers("tns.world");
  726. }
  727. void laset_EnableGLDebug(void* unused, int e){ MAIN.EnableGLDebug=e; la_NotifyGLDebugChanges(); }
  728. void laset_GLDebugSync(void* unused, int e){ MAIN.GLDebugSync=e; la_NotifyGLDebugChanges(); }
  729. void laset_GLDebugLevel(void* unused, int e){ MAIN.GLDebugLevel=e; la_NotifyGLDebugChanges(); }
  730. void laset_Language(void* unused, laTranslationNode* lang){
  731. MAIN.Translation.CurrentLanguage = lang;
  732. laRedrawAllWindows();
  733. }
  734. //void laget_DetachedPropContainerID(laProp* p, char * result) {
  735. // strcpy(result, p->Detached->Container->Identifier);
  736. //}
  737. //void laget_DetachedPropPropID(laProp* p, char * result) {
  738. // strcpy(result, p->Detached->Identifier);
  739. //}
  740. //void laset_DetachedPropContainerID(laProp* p, char * content) {
  741. // p->Description = CreateNewBuffer(char, 128);
  742. // strcpy(p->Description, content);
  743. //}
  744. //void laset_DetachedPropPropID(laProp* p, char * content) {
  745. // p->Name = CreateNewBuffer(char, 128);
  746. // strcpy(p->Name, content);
  747. //}
  748. void laread_DetachedPropRename(laProp *p, char *content){
  749. p->Identifier = CreateNewBuffer(char, 128);
  750. strcpy(p->Identifier, content);
  751. }
  752. void laget_DetachedPropPath(laProp *p, char *result, char** here){
  753. la_GetPropPackPath(&p->DetachedPP, result);
  754. }
  755. void laread_DetachedPropPath(laProp *p, char *content){
  756. p->DetachedPP.Go = CreateNewBuffer(char, 128);
  757. strcpy(p->DetachedPP.Go, content);
  758. }
  759. int la_GetPropertySize(int Type);
  760. void lapost_DetachedProp(laProp *Prop){
  761. laPropContainer *pc = 0;
  762. laSubProp *np = 0;
  763. laIntProp *ip;
  764. laFloatProp *fp;
  765. laEnumProp *ep;
  766. laSubProp *sp;
  767. char *path = Prop->DetachedPP.Go;
  768. char *id = Prop->Identifier;
  769. laPropPack TempPP = {0};
  770. laListItem Item;
  771. Prop->DetachedPP.Go = 0;
  772. memcpy(&Item, &Prop->Item, sizeof(laListItem));
  773. la_GetPropFromPath(&TempPP, Prop->DetachedPP.RawThis, path, 0);
  774. //FreeMem(path);
  775. memcpy(Prop, TempPP.LastPs->p, la_GetPropertySize(TempPP.LastPs->p->PropertyType));
  776. memcpy(&Prop->DetachedPP, &TempPP, sizeof(laPropPack));
  777. memcpy(&Prop->Item, &Item, sizeof(laListItem));
  778. switch (Prop->PropertyType){
  779. case LA_PROP_INT:
  780. case LA_PROP_INT | LA_PROP_ARRAY:
  781. ip = Prop;
  782. ip->Detached = CreateNewBuffer(int, Prop->Len ? Prop->Len : 1);
  783. break;
  784. case LA_PROP_FLOAT:
  785. case LA_PROP_FLOAT | LA_PROP_ARRAY:
  786. fp = Prop;
  787. fp->Detached = CreateNewBuffer(real, Prop->Len ? Prop->Len : 1);
  788. break;
  789. case LA_PROP_ENUM:
  790. case LA_PROP_ENUM | LA_PROP_ARRAY:
  791. ep = Prop;
  792. ep->Detached = CreateNewBuffer(int, 1);
  793. ep->Detached[0] = ((laEnumItem *)ep->Items.pFirst)->Index;
  794. }
  795. Prop->Identifier = id;
  796. }
  797. void latouched_NodeInSocket(void* unused, int hint){
  798. laGraphRequestRebuild();
  799. }
  800. int lafilter_NodeCategory(void* unused, laNodeCategory* c){
  801. if(c->For&MAIN.FilterNodeCategory) return 1; return 0;
  802. }
  803. void* laget_FirstInputMapping(void* unused1,void* unused2){
  804. return MAIN.InputMapping->InputMappings.pFirst;
  805. }
  806. void* laget_CurrentInputMapping(laInputMappingBundle* imb){
  807. return imb->CurrentInputMapping;
  808. }
  809. void* laget_FirstToolbox(void* unused1,void* unused2){
  810. return MAIN.InputMapping->Toolboxes.pFirst;
  811. }
  812. void* laget_CurrentToolbox(laInputMappingBundle* imb){
  813. return imb->CurrentToolbox;
  814. }
  815. void *laget_detached_FirstToolbox(void *UNUSED1, void *UNUSED2){
  816. return MAIN.InputMapping->Toolboxes.pFirst;
  817. }
  818. void* laget_FirstCustomSignal(void* unused1,void* unused2){
  819. return MAIN.CustomSignals.pFirst;
  820. }
  821. void laset_InputMappingEntrySignal(laInputMappingEntry* ime, laCustomSignal* cs){
  822. if(cs){ strSafeSet(&ime->Signal,SSTR(cs->Name)); ime->SignalValue=cs->Signal; }
  823. else{ strSafeSet(&ime->Signal,"none"); ime->SignalValue=0; }
  824. }
  825. void laset_InputMappingEntryKeyString(laInputMappingEntry* ime, char* key){
  826. strSafeSet(&ime->Key,key); laInputMappingUpdateSignal(ime);
  827. }
  828. void laset_InputMappingEntrySignalString(laInputMappingEntry* ime, char* sig){
  829. strSafeSet(&ime->Signal,sig); laInputMappingUpdateSignal(ime);
  830. }
  831. void laset_InputMappingEntryMove(laInputMappingEntry* ime, int move){
  832. laInputMapping* im = ime->Parent;
  833. if(move<0 && ime->Item.pPrev){ lstMoveUp(&im->Entries, ime); laNotifyUsers("la.input_mapping"); }
  834. elif(move>0 && ime->Item.pNext){ lstMoveDown(&im->Entries, ime); laNotifyUsers("la.input_mapping"); }
  835. }
  836. void laset_InputMappingEntryOperatorString(laInputMappingEntry* ime, char* string){
  837. strSafeSet(&ime->Operator,string);
  838. laOperatorType* at=laGetOperatorType(string);
  839. if(at){
  840. strSafeSet(&ime->OperatorName, at->Name);
  841. ime->OperatorType = at;
  842. }else{
  843. strSafeSet(&ime->OperatorName, string);
  844. }
  845. }
  846. void laset_SignalFilter(void* unused, char* sig){
  847. strSafeSet(&MAIN.SignalFilter,sig);
  848. laNotifyUsers("la.filtered_signals");
  849. }
  850. void* laget_FirstFilteredCustomSignal(void* unused1,laPropIterator* pi){
  851. laCustomSignal* p = MAIN.CustomSignals.pFirst;
  852. while(!strstr(SSTR(p->Name),SSTR(MAIN.SignalFilter))){ p=p->Item.pNext; if(!p){ return 0; } }
  853. return p;
  854. }
  855. void* lagetnext_FilteredSignal(laCustomSignal* p, laPropIterator* pi){
  856. p=p->Item.pNext; if(!p){ return 0; }
  857. while(!strstr(SSTR(p->Name),SSTR(MAIN.SignalFilter))){ p=p->Item.pNext; if(!p){ return 0; } }
  858. return p;
  859. }
  860. void laset_OperatorFilter(void* unused, char* sig){
  861. strSafeSet(&MAIN.OperatorFilter,sig);
  862. laNotifyUsers("la.filtered_operators");
  863. }
  864. void* laget_FirstFilteredOperator(void* unused1,laPropIterator* pi){
  865. laOperatorType* at = MAIN.OperatorList.pFirst;
  866. while(at->ExtraMark & (LA_ACTUATOR_HIDDEN|LA_ACTUATOR_SYSTEM)){
  867. at=at->ListItem.pNext; if(!at){ return 0; }
  868. }
  869. while((!strstr(at->Name,SSTR(MAIN.OperatorFilter))) && (!strstr(at->Identifier,SSTR(MAIN.OperatorFilter)))){
  870. at=at->ListItem.pNext; if(!at){ return 0; }
  871. }
  872. return at;
  873. }
  874. void* lagetnext_FilteredOperator(laOperatorType* at, laPropIterator* pi){
  875. at=at->ListItem.pNext; if(!at){ return 0; }
  876. while(at->ExtraMark & (LA_ACTUATOR_HIDDEN|LA_ACTUATOR_SYSTEM)){
  877. at=at->ListItem.pNext; if(!at){ return 0; }
  878. }
  879. while((!strstr(at->Name,SSTR(MAIN.OperatorFilter))) && (!strstr(at->Identifier,SSTR(MAIN.OperatorFilter)))){
  880. at=at->ListItem.pNext; if(!at){ return 0; }
  881. }
  882. return at;
  883. }
  884. void tnspost_World(tnsWorld *w){
  885. tnsRefreshMaterialLibraries();
  886. laAnimationUpdateHolderList();
  887. }
  888. void tnspost_Material(tnsMaterial *m){
  889. tns_GetMaterial2D(m);
  890. //if(m->AsLibrary){ tnsRefreshMaterialLibraries(); return; }
  891. //tnsEnsureMaterialShader(m,1);
  892. }
  893. void tnspost_Object(tnsObject *o){ //XXX: No instance clear operation for object?
  894. laListItemPointer* NextLip,*NextLip2;
  895. if(o->Type!=TNS_OBJECT_ROOT){
  896. tnsDeltaTransformValueChanged(o); tnsGlobalMatrixChanged(o,1);
  897. }else{ tnsRootObject* ro=o;
  898. for(laAction* aa=ro->Actions.pFirst;aa;aa=aa->Item.pNext){
  899. if(!aa->HolderContainer){
  900. aa->HolderContainer=la_ContainerLookup("tns_root_object");
  901. aa->HolderInstance=ro;
  902. }
  903. }
  904. }
  905. for(laListItemPointer* lip=o->ChildObjects.pFirst;lip;lip=NextLip){
  906. NextLip=lip->pNext; if(!lip->p){ lstRemoveItem(&o->ChildObjects,lip); memFree(lip); continue; }
  907. for(laListItemPointer* lip2=NextLip;lip2;lip2=NextLip2){ NextLip2=lip2->pNext;
  908. if(lip2->p==lip->p){ NextLip=lip2->pNext; lstRemoveItem(&o->ChildObjects,lip2); memFree(lip2); continue; }
  909. }
  910. }
  911. }
  912. void tnspropagate_Object(tnsObject* o, laUDF* udf, int force){
  913. for(laListItemPointer* lip=o->ChildObjects.pFirst;lip;lip=lip->pNext){ if(!lip->p) continue;
  914. if(force || !laget_InstanceActiveUDF(lip->p)){ laset_InstanceUDF(lip->p, udf); tnspropagate_Object(lip->p,udf,force); }
  915. }
  916. }
  917. void tnstouched_Object(tnsObject *o, int hint){
  918. printf("touched\n");
  919. if(o->Type==TNS_OBJECT_MESH && (hint&TNS_HINT_GEOMETRY)){
  920. tnsInvalidateMeshBatch(o);
  921. }
  922. tnsInvalidateEvaluation(o);
  923. laNotifyUsers("tns.world");
  924. }
  925. int tnsfilter_SavableObject(void* unused, tnsObject* o){
  926. if(o->InRoot) return 1; return 0;
  927. }
  928. int tnsget_MeshObjectVertSize(tnsMeshObject* o){ return o->totv*sizeof(tnsVert);/*can't use maxv*/ }
  929. int tnsget_MeshObjectEdgeSize(tnsMeshObject* o){ return o->tote*sizeof(tnsEdge);/*can't use maxv*/ }
  930. void* tnsget_MeshObjectFaceRaw(tnsMeshObject* o, int* r_size, int* r_is_copy){
  931. if(o->Mode==TNS_MESH_EDIT_MODE) return 0;
  932. int* arr=0; int next=0,max=0; int i=0;
  933. arrEnsureLength(&arr, i, &max, sizeof(int));
  934. arr[i]=o->totf; i++;
  935. for(int f=0;f<o->totf;f++){
  936. arrEnsureLength(&arr, i+o->f[f].looplen+6, &max, sizeof(int));
  937. arr[i]=o->f[f].looplen; i++;
  938. arr[i]=o->f[f].flags; i++;
  939. arr[i]=o->f[f].mat; i++;
  940. float* nm=(void*)&arr[i]; tnsVectorSet3v(nm,o->f[f].n); i+=3;
  941. for(int l=0;l<o->f[f].looplen;l++){
  942. arr[i]=o->f[f].loop[l]; i++;
  943. }
  944. }
  945. *r_size = i*sizeof(int);
  946. *r_is_copy = 1;
  947. return arr;
  948. }
  949. void tnsset_MeshObjectFaceRaw(tnsMeshObject* o, int* data, int s){
  950. if(o->f){
  951. for(int fi=0;fi<o->maxf;fi++){ // ??? due to undo property order, maxf can be != totf, will it have problems?
  952. if(o->f[fi].loop){ free(o->f[fi].loop); o->f[fi].loop=0; }
  953. }
  954. arrFree(&o->f, &o->maxf); o->totf=0; o->maxf=0;
  955. }
  956. if(!data) return;
  957. int totf=data[0]; int i=1;
  958. o->f=calloc(1,sizeof(tnsFace)*totf); o->maxf=o->totf=totf;
  959. for(int fi=0;fi<totf;fi++){
  960. tnsFace*f=&o->f[fi];
  961. f->looplen=data[i]; i++;
  962. f->flags=data[i]; i++;
  963. f->mat=data[i]; i++;
  964. float* nm=(void*)&data[i]; tnsVectorSet3v(f->n,nm); i+=3;
  965. f->loop=calloc(1,sizeof(int)*f->looplen);
  966. for(int li=0;li<f->looplen;li++){
  967. f->loop[li]=data[i]; i++;
  968. }
  969. }
  970. }
  971. void tns_InvalidateMeshWithMaterial(tnsMaterial* m){
  972. for(tnsMeshObject* o=T->World->AllObjects.pFirst;o;o=o->Base.Item.pNext){
  973. if(o->Base.Type!=TNS_OBJECT_MESH) continue;
  974. for(tnsMaterialSlot* ms=o->Materials.pFirst;ms;ms=ms->Item.pNext){
  975. if(ms->Material==m){ tnsInvalidateMeshBatch(o); break; }
  976. }
  977. }
  978. }
  979. void tnsset_MaterialColor(tnsMaterial* m, real* c){
  980. tnsVectorCopy4d(c,m->Color); tns_InvalidateMeshWithMaterial(m); laNotifyUsers("tns.world");
  981. }
  982. void tnsset_MaterialColor2(tnsMaterial* m, real* c){ tnsVectorCopy4d(c,m->Color2); laNotifyUsers("tns.world"); }
  983. void tnsset_MaterialGradientMode(tnsMaterial* m, int Mode){ m->GradientMode=Mode; laNotifyUsers("tns.world"); }
  984. void tnsset_MaterialGradientCenter(tnsMaterial* m, real* c){ tnsVectorCopy2d(c,m->GradientCenter); laNotifyUsers("tns.world"); }
  985. void tnsset_MaterialGradientSize(tnsMaterial* m, real* c){ tnsVectorCopy2d(c,m->GradientSize); laNotifyUsers("tns.world"); }
  986. void tnsset_MaterialGradientF(tnsMaterial* m, real c){ m->GradientBoxF=c; laNotifyUsers("tns.world"); }
  987. void tnsset_MaterialGradientR(tnsMaterial* m, real c){ m->GradientBoxR=c; laNotifyUsers("tns.world"); }
  988. void tnsget_MaterialSlotname(tnsMaterialSlot* ms, char *result, char** here){
  989. if(!ms){ strcpy(result,"?"); return; }
  990. if(ms->Material&&ms->Material->Name&&ms->Material->Name->Ptr){
  991. sprintf(result,"%d: %s",ms->Index,ms->Material->Name->Ptr); return;
  992. }
  993. sprintf(result,"%d: %s",ms->Index,transLate("<Default Material>"));
  994. }
  995. tnsMaterialSlot* tnsget_FirstMaterialSlot(tnsObject* o, void* unused){
  996. if(o->Type==TNS_OBJECT_MESH) return ((tnsMeshObject*)o)->Materials.pFirst;
  997. if(o->Type==TNS_OBJECT_SHAPE) return ((tnsShapeObject*)o)->Materials.pFirst;
  998. return 0;
  999. }
  1000. tnsMaterialSlot* tnsget_ActiveMaterialSlot(tnsObject* o){
  1001. if(o->Type==TNS_OBJECT_MESH) return ((tnsMeshObject*)o)->CurrentMaterial;
  1002. if(o->Type==TNS_OBJECT_SHAPE) return ((tnsShapeObject*)o)->CurrentMaterial;
  1003. return 0;
  1004. }
  1005. void tnsset_ActiveMaterialSlot(tnsObject* o, tnsMaterialSlot* ms){
  1006. if(o->Type==TNS_OBJECT_MESH){ memAssignRef(o,&((tnsMeshObject*)o)->CurrentMaterial,ms); return; }
  1007. if(o->Type==TNS_OBJECT_SHAPE){ memAssignRef(o,&((tnsShapeObject*)o)->CurrentMaterial,ms); return; }
  1008. }
  1009. void tnsset_ShapeObjectBackdrop(tnsShapeObject* o, int v){
  1010. o->Backdrop=v; tnsInvalidateEvaluation(o); laNotifyUsers("tns.world");
  1011. }
  1012. tnsMaterial* tnsget_FirstMaterial(void* unused1, void* unused2){
  1013. return T->World->Materials.pFirst;
  1014. }
  1015. tnsMaterial* tnsgetactive_SlotMaterial(tnsMaterialSlot* ms, void* unused){
  1016. return ms->Material;
  1017. }
  1018. tnsCamera* tnsget_CameraInRoot(tnsRootObject* ro, void* unused){
  1019. for(tnsObject* o=T->World->AllObjects.pFirst;o;o=o->Item.pNext){ if(o->InRoot!=ro) continue;
  1020. if(o->Type==TNS_OBJECT_CAMERA) return o;
  1021. }
  1022. return 0;
  1023. }
  1024. tnsCamera* tnsgetnext_CameraInRoot(tnsCamera* c, void* unused){
  1025. for(tnsObject* o=c->Base.Item.pNext;o;o=o->Item.pNext){ if(o->InRoot!=c->Base.InRoot) continue;
  1026. if(o->Type==TNS_OBJECT_CAMERA) return o;
  1027. }
  1028. return 0;
  1029. }
  1030. laPropContainer* tnsget_ObjectType(tnsObject* o){
  1031. switch(o->Type){
  1032. case TNS_OBJECT_INSTANCER: return TNS_PC_OBJECT_INSTANCER;
  1033. case TNS_OBJECT_CAMERA: return TNS_PC_OBJECT_CAMERA;
  1034. case TNS_OBJECT_MESH: return TNS_PC_OBJECT_MESH;
  1035. case TNS_OBJECT_LIGHT: return TNS_PC_OBJECT_LIGHT;
  1036. case TNS_OBJECT_ROOT: return TNS_PC_OBJECT_ROOT;
  1037. case TNS_OBJECT_SHAPE: return TNS_PC_OBJECT_SHAPE;
  1038. default: return TNS_PC_OBJECT_GENERIC;
  1039. }
  1040. }
  1041. tnsObject* tnsget_ObjectRetarget(tnsObject* o, void* unused){
  1042. if(o && o->PlayDuplicate) return o->PlayDuplicate;
  1043. return o;
  1044. }
  1045. void laget_AnimationActionHolderCategory(void* a_unused, laActionHolder* ah, char* copy, char** ptr){
  1046. if(ah->CategoryTitle&&ah->CategoryTitle->Ptr) *ptr=ah->CategoryTitle->Ptr;
  1047. }
  1048. int laget_AnimationActionCurrentFrame(laAction* aa){
  1049. return LA_ACTION_FRAME(aa,-1);
  1050. }
  1051. void laget_AnimationPropStr(laActionProp* ap, char* str, char** here){
  1052. sprintf(str,"%s.%s",ap->Prop->Container->Identifier,ap->Prop->Identifier);
  1053. }
  1054. void laread_AnimationPropStr(laActionProp* ap, char* str){
  1055. if(!str || !str[0]) return;
  1056. laStringSplitor* ss=strSplitPath(str,0); if(ss->NumberParts!=2) goto anim_set_prop_str_cleanup;
  1057. laStringPart* sp1=ss->parts.pFirst,*sp2=ss->parts.pLast;
  1058. laPropContainer* pc=la_ContainerLookup(sp1->Content); if(!pc) goto anim_set_prop_str_cleanup;
  1059. laProp* p=la_PropLookup(&pc->Props,sp2->Content); if(!p) goto anim_set_prop_str_cleanup;
  1060. ap->Prop=p;
  1061. anim_set_prop_str_cleanup:
  1062. strDestroyStringSplitor(&ss);
  1063. }
  1064. void* lagetraw_ActionKeyData(laActionKey* ak, int* r_size, int* ret_is_copy){
  1065. *r_size=ak->DataSize; *ret_is_copy=1; if(!ak->DataSize){ return 0; }
  1066. void* data=malloc(ak->DataSize); memcpy(data,ak->Data,ak->DataSize);
  1067. return data;
  1068. }
  1069. void lasetraw_ActionKeyData(laActionKey* ak, void* data, int DataSize){
  1070. ak->DataSize=DataSize; ak->Data=memAcquireSimple(DataSize); memcpy(ak->Data,data,DataSize);
  1071. }
  1072. void laset_AnimationPlayHead(void* unused,real data){
  1073. if(data<0){ data=0; }
  1074. laAnimationSetPlayHead(data); la_AnimationEvaluateActions(1); laNotifyUsers("la.animation");
  1075. }
  1076. void laget_ActionContainer(laAction* aa, char* str, char** here){ *here=aa->HolderContainer->Identifier; }
  1077. void laread_ActionContainer(laAction* aa, char* str){ aa->HolderContainer=la_ContainerLookup(str); }
  1078. int laaction_VerifyRootObject(void* Parent, laPropContainer* ParentType, void* Child, laPropContainer* ChildType){
  1079. if(ParentType!=TNS_PC_OBJECT_ROOT) return 0;
  1080. if (ChildType==TNS_PC_OBJECT_GENERIC||ChildType==TNS_PC_OBJECT_CAMERA||ChildType==TNS_OBJECT_SHAPE||
  1081. ChildType==TNS_PC_OBJECT_INSTANCER||ChildType==TNS_PC_OBJECT_LIGHT||ChildType==TNS_OBJECT_MESH){
  1082. tnsObject*o=Child; if(o==Parent || o->InRoot==Parent) return 1;
  1083. }
  1084. if (ChildType==TNS_PC_MATERIAL){ return 1; }
  1085. return 0;
  1086. }
  1087. void lareset_Main(void* Unused){
  1088. return;
  1089. }
  1090. laPropContainer* LA_PC_SOCKET_IN;
  1091. laPropContainer* LA_PC_SOCKET_OUT;
  1092. laPropContainer* LA_PROP_SOCKET_SOURCE;
  1093. laPropContainer* LA_PROP_SOCKET_OUT;
  1094. laPropContainer* LA_PC_MAPPER;
  1095. laPropContainer* LA_PC_RACK_PAGE;
  1096. laPropContainer* TNS_PC_OBJECT_GENERIC;
  1097. laPropContainer* TNS_PC_OBJECT_INSTANCER;
  1098. laPropContainer* TNS_PC_OBJECT_CAMERA;
  1099. laPropContainer* TNS_PC_OBJECT_LIGHT;
  1100. laPropContainer* TNS_PC_OBJECT_MESH;
  1101. laPropContainer* TNS_PC_OBJECT_SHAPE;
  1102. laPropContainer* TNS_PC_OBJECT_ROOT;
  1103. laPropContainer* TNS_PC_MATERIAL;
  1104. laPropContainer* TNS_PC_MATERIAL_SLOT;
  1105. laProp* LA_PROP_CONTROLLER;
  1106. void la_RegisterGeneralProps(){
  1107. laPropContainer *p, *ip, *p2, *ip2, *sp1, *sp2;
  1108. laProp *ep;
  1109. laPropPack pp;
  1110. laSubProp *sp;
  1111. laKeyMapper *km;
  1112. p = la_SetGeneralRoot(&MAIN.GeneralIntSub, "__general_int__", "Genral Int Operations", "Genral Int Operations");
  1113. laAddOperatorProperty(p, "restore", "Restore Default", "Restore the property to the original value", "LA_prop_restore_default", U'⭯', 0);
  1114. laAddOperatorProperty(p, "set_max", "Set Max", "Set property to its maximum value", "LA_prop_set_max", 0,0);
  1115. laAddOperatorProperty(p, "set_min", "Set Min", "Set property to its minimum value", "LA_prop_set_min", 0,0);
  1116. //laAddOperatorProperty(p, "hyper_data", "View Hyper Data", "Show Properties Of Specific Data Block", "LA_view_hyper_data", U'🛈', 0);
  1117. laAddOperatorProperty(p, "insert_key", "Insert Key Frame", "Insert key frame in the active action", "LA_prop_insert_key", 0,0);
  1118. p = la_SetGeneralRoot(&MAIN.GeneralIntArraySub, "__general_int_arr__", "Genral Int Array Operations", "Genral Int Array Operations");
  1119. laAddOperatorProperty(p, "restore", "Restore Default", "Restore the property to the original value", "LA_prop_restore_default", U'⭯', 0);
  1120. laAddOperatorProperty(p, "set_max", "Set Max", "Set property to its maximum value", "LA_prop_set_max", 0,0);
  1121. laAddOperatorProperty(p, "set_min", "Set Min", "Set property to its minimum value", "LA_prop_set_min", 0,0);
  1122. //laAddOperatorProperty(p, "hyper_data", "View Hyper Data", "Show Properties Of Specific Data Block", "LA_view_hyper_data", U'🛈', 0);
  1123. laAddOperatorProperty(p, "insert_key", "Insert Key Frame", "Insert key frame in the active action", "LA_prop_insert_key", 0,0);
  1124. p = la_SetGeneralRoot(&MAIN.GeneralFloatSub, "__general_real__", "Genral Float Operations", "Genral Float Operations");
  1125. laAddOperatorProperty(p, "restore", "Restore Default", "Restore the property to the original value", "LA_prop_restore_default", U'⭯', 0);
  1126. laAddOperatorProperty(p, "set_max", "Set Max", "Set property to its maximum value", "LA_prop_set_max", 0,0);
  1127. laAddOperatorProperty(p, "set_min", "Set Min", "Set property to its minimum value", "LA_prop_set_min", 0,0);
  1128. //laAddOperatorProperty(p, "hyper_data", "View Hyper Data", "Show Properties Of Specific Data Block", "LA_view_hyper_data", U'🛈', 0);
  1129. laAddOperatorProperty(p, "insert_key", "Insert Key Frame", "Insert key frame in the active action", "LA_prop_insert_key", 0,0);
  1130. p = la_SetGeneralRoot(&MAIN.GeneralFloatArraySub, "__general_real_arr__", "Genral Float Array Operations", "Genral Float Array Operations");
  1131. laAddOperatorProperty(p, "restore", "Restore Default", "Restore the property to the original value", "LA_prop_restore_default", U'⭯', 0);
  1132. laAddOperatorProperty(p, "set_max", "Set Max", "Set property to its maximum value", "LA_prop_set_max", 0,0);
  1133. laAddOperatorProperty(p, "set_min", "Set Min", "Set property to its minimum value", "LA_prop_set_min", 0,0);
  1134. //laAddOperatorProperty(p, "hyper_data", "View Hyper Data", "Show Properties Of Specific Data Block", "LA_view_hyper_data", U'🛈', 0);
  1135. laAddOperatorProperty(p, "insert_key", "Insert Key Frame", "Insert key frame in the active action", "LA_prop_insert_key", 0,0);
  1136. p = la_SetGeneralRoot(&MAIN.GeneralEnumSub, "__general_enum__", "Genral Enum Operations", "Genral Enum Operations");
  1137. laAddOperatorProperty(p, "restore", "Restore Default", "Restore the property to the original value", "LA_prop_restore_default", U'⭯', 0);
  1138. laAddOperatorProperty(p, "insert_key", "Insert Key Frame", "Insert key frame in the active action", "LA_prop_insert_key", 0,0);
  1139. p = la_SetGeneralRoot(&MAIN.GeneralEnumArraySub, "__general_enum_arr__", "Genral Enum Array Operations", "Genral Enum Array Operations");
  1140. laAddOperatorProperty(p, "restore", "Restore Default", "Restore the property to the original value", "LA_prop_restore_default", U'⭯', 0);
  1141. laAddOperatorProperty(p, "insert_key", "Insert Key Frame", "Insert key frame in the active action", "LA_prop_insert_key", 0,0);
  1142. p = la_SetGeneralRoot(&MAIN.GeneralStringSub, "__general_string__", "Genral String Operations", "Genral String Operations");
  1143. laAddOperatorProperty(p, "copy", "Copy", "Copy to clipboard", "LA_string_copy", 0,0);
  1144. laAddOperatorProperty(p, "paste", "Paste", "Paste from clipboard", "LA_system_paste", 0,0);
  1145. laAddOperatorProperty(p, "restore", "Restore Default", "Restore default value", "LA_string_set_default", U'⭯', 0);
  1146. laAddOperatorProperty(p, "get_folder_path", "Get Folder Path", "Get a folder path", "LA_string_get_folder_path", U'📁', 0);
  1147. laAddOperatorProperty(p, "get_file_path", "Get File Path", "Get a file path", "LA_string_get_file_path", U'🖹', 0);
  1148. p->MenuUiDefine=laui_StringPropUiDefine;
  1149. p = la_SetGeneralRoot(&MAIN.GeneralOperatorSub, "__general_operator__", "Genral Operator Operations", "Genral Operator Operations");
  1150. p = la_SetGeneralRoot(&MAIN.GeneralCollectionSub, "__general_collection__", "Genral Collection Operations", "Genral Collection Operations");
  1151. laAddOperatorProperty(p, "put_data_block", "Put", "Append Pending Data Block Here", "LA_sub_put_data_block", U'🔗', 0);
  1152. laAddOperatorProperty(p, "save_instance", "Save Instance", "Save instance as a UDF block", "LA_udf_save_instance", 0,0);
  1153. laAddOperatorProperty(p, "clear_selection", "Clear Selection", "Clear selected instance", "LA_collection_clear_selection", U'🧹',0);
  1154. }
  1155. void lareset_RackPage(laRackPage* rp){
  1156. laNodeRack* r; while(r=rp->Racks.pFirst){
  1157. laBaseNode* bn; while(bn=r->Nodes.pFirst){
  1158. bn->Type->Destroy(bn); lstRemoveItem(&r->Nodes,bn);
  1159. }
  1160. lstRemoveItem(&r->ParentPage->Racks, r); memLeave(r);
  1161. }
  1162. }
  1163. laRackPage* DEBUG_READ_RACK_PAGE=0; // some files have rack parent page missing, this to fix.
  1164. void lapost_RackPage(laRackPage* rp){ DEBUG_READ_RACK_PAGE=rp; }
  1165. void la_RegisterTNSProps(){
  1166. laPropContainer *p, *ip, *p2, *ip2, *sp1, *sp2;
  1167. laProp *ep; laPropPack pp; laSubProp *sp; laKeyMapper *km;
  1168. laCanvasTemplate *v2dt;
  1169. p = laAddPropertyContainer("tns_main", "TNS Main", "Render kernel root structure", 0,0,sizeof(tnsMain), 0,0,1);{
  1170. if(MAIN.InitArgs.HasWorldObjects){
  1171. laAddSubGroup(p, "world", "World", "World Descriptor", "tns_world",0,0,0,offsetof(tnsMain, World), 0,0,0,0,0,0,0,LA_UDF_SINGLE);
  1172. }
  1173. sp = laAddSubGroup(p, "texture_list", "Texture List", "List Of All Textures Under TNS Management", "tns_texture",0,0,0,-1, 0,tnsget_PreviewTexture, 0,0,0,tnsset_PreviewTexture, offsetof(tnsMain, Textures), LA_UDF_IGNORE);
  1174. laSubGroupDetachable(sp, tnsget_detached_FirstTexture, laget_ListNext);
  1175. //laAddSubGroup(p, "Render Buffers", "Storing All Render Buffers In Current Program Instance", "tns_render_buffer",0,0,0,offsetof(tnsMain, ActiveRenderBuffer), 0,0,0,0,0,0,0,0,offsetof(tnsMain, RenderBuffers), 0);
  1176. }
  1177. p = laAddPropertyContainer("tns_texture", "TNS Texture Item", "A texture descriptor with gl handle", 0,0,sizeof(tnsTexture), 0,0,0);{
  1178. laAddIntProperty(p, "gl_handle", "OpenGL Handle", "Opengl handle of this texture", LA_WIDGET_INT_PLAIN, 0,0,0,0,0,0,0,offsetof(tnsTexture, GLTexHandle), 0,0,0,0,0,0,0,0,0,0,LA_AS_IDENTIFIER|LA_READ_ONLY);
  1179. laAddIntProperty(p, "size", "Size", "Width And Height", 0,"Width,Height", "px", 0,0,0,0,0,offsetof(tnsTexture, Width), 0,0,2, 0,0,0,0,0,0,0,LA_READ_ONLY);
  1180. ep = laAddEnumProperty(p, "internal_type", "Internal Type", "Internal bits type", LA_WIDGET_ENUM_CYCLE, 0,0,0,0,offsetof(tnsTexture, GLTexBitsType), 0,0,0,0,0,0,0,0,0,LA_READ_ONLY);{
  1181. laAddEnumItemAs(ep, "rgba", "GL_RGBA", "GL_RGBA", GL_RGBA8,0);
  1182. laAddEnumItemAs(ep, "rgb", "GL_RGB", "GL_RGB", GL_RGB8,0);
  1183. laAddEnumItemAs(ep, "rg", "GL_RG", "GL_RG", GL_RG8,0);
  1184. laAddEnumItemAs(ep, "r", "GL_RED", "GL_RED", GL_R8,0);
  1185. laAddEnumItemAs(ep, "rgba32f", "GL_RGBA32F", "GL_RGBA32F", GL_RGBA32F,0);
  1186. laAddEnumItemAs(ep, "rgb32f", "GL_RGB32F", "GL_RGB32F", GL_RGB32F,0);
  1187. laAddEnumItemAs(ep, "rg32f", "GL_RG32F", "GL_RG32F", GL_RG32F,0);
  1188. laAddEnumItemAs(ep, "r32f", "GL_R32F", "GL_R32F", GL_R32F,0);
  1189. laAddEnumItemAs(ep, "rgba32i", "GL_RGBA32I", "GL_R32I", GL_RGBA32I,0);
  1190. laAddEnumItemAs(ep, "rgb32i", "GL_RGB32I", "GL_R32I", GL_RGB32I,0);
  1191. laAddEnumItemAs(ep, "rg32i", "GL_RG32I", "GL_R32I", GL_RG32I,0);
  1192. laAddEnumItemAs(ep, "r32i", "GL_R32I", "GL_R32I", GL_R32I,0);
  1193. laAddEnumItemAs(ep, "depth", "GL_DEPTH_COMPONENT32F", "GL_DEPTH_COMPONENT32F", GL_DEPTH_COMPONENT32F,0);
  1194. }
  1195. p->Template2D = la_GetCanvasTemplate(0,"la_CanvasDrawTexture");
  1196. }
  1197. if(!MAIN.InitArgs.HasWorldObjects) return;
  1198. p = laAddPropertyContainer("tns_world", "World", "3d world structure", 0,0,sizeof(tnsWorld),tnspost_World,0,1);{
  1199. sp = laAddSubGroup(p, "root_objects", "Root Objects", "List of all root objects", "tns_object",tnsget_ObjectType,0,0,-1,0,0,0,0,0,0,offsetof(tnsWorld, RootObjects), 0);
  1200. laSubGroupDetachable(sp, tnsget_detached_FirstRootObject, laget_ListNext);
  1201. sp = laAddSubGroup(p, "root_objects_as_root", "Root Objects", "List of all root objects (in type tns_root_object)", "tns_root_object",0,0,0,-1,0,0,0,0,0,0,offsetof(tnsWorld, RootObjects), LA_UDF_IGNORE);
  1202. laSubGroupDetachable(sp, tnsget_detached_FirstRootObject, laget_ListNext);
  1203. laAddSubGroup(p, "active_root", "Active Root Object", "Global active root object", "tns_object",0,0,0,offsetof(tnsWorld,ActiveRoot),tnsget_detached_FirstRootObject,0,laget_ListNext,0,0,0,0,LA_UDF_REFER);
  1204. sp = laAddSubGroup(p, "objects", "Objects", "List of all objects", "tns_object",tnsget_ObjectType, 0,0,-1,0,0,0,0,0,0,offsetof(tnsWorld, AllObjects), 0);
  1205. laSubGroupExtraFunctions(sp,tnsfilter_SavableObject,tnsfilter_SavableObject,0,0,0);
  1206. sp = laAddSubGroup(p, "materials", "Materials", "List of all materials", "tns_material",0,0,0,-1,0,0,0,0,0,0,offsetof(tnsWorld, Materials), 0);
  1207. laSubGroupDetachable(sp, tnsget_detached_FirstMaterial, laget_ListNext);
  1208. ep = laAddEnumProperty(p, "property_page", "Property Page", "Show which page in the properties panel", 0,0,0,1,0,offsetof(tnsWorld, PropertyPage), 0,0,0,0,0,0,0,0,0,LA_UDF_IGNORE);{
  1209. laAddEnumItemAs(ep, "ROOT", "Root", "Display root object properties",0,0);
  1210. laAddEnumItemAs(ep, "OBJECT", "Object", "Display object properties",1,0);
  1211. }
  1212. }
  1213. p = laAddPropertyContainer("tns_child_object", "Child Object", "Child object linker", 0,0,sizeof(laListItemPointer), 0,0,0);{
  1214. laAddSubGroup(p, "object", "Object", "Object link", "tns_object",tnsget_ObjectType, 0,0,offsetof(laListItemPointer, p), 0,0,0,0,0,0,0,LA_UDF_REFER);
  1215. }
  1216. p = laAddPropertyContainer("tns_material", "Material" "Object material", 0,0,0,sizeof(tnsMaterial),tnspost_Material,0,2);{
  1217. TNS_PC_MATERIAL=p;
  1218. laAddStringProperty(p, "name", "Material Name", "The name ff the material", 0,0,0,0,1, offsetof(tnsMaterial, Name), 0,0,0,0,LA_AS_IDENTIFIER);
  1219. laAddFloatProperty(p, "color", "Color", "Base color of the material", LA_WIDGET_FLOAT_COLOR, "R,G,B,A", 0,1,0,0.025, 1, 0,offsetof(tnsMaterial, Color), 0,0,4, 0,0,0,0,tnsset_MaterialColor,0,0,LA_PROP_KEYABLE);
  1220. laAddFloatProperty(p, "color2", "Color 2", "Gradient end color of the material", LA_WIDGET_FLOAT_COLOR, "R,G,B,A", 0,1,0,0.025, 1, 0,offsetof(tnsMaterial, Color2), 0,0,4, 0,0,0,0,tnsset_MaterialColor2,0,0,LA_PROP_KEYABLE);
  1221. ep = laAddEnumProperty(p, "colorful", "Colorful", "Use colorful display", 0,0,0,0,0,offsetof(tnsMaterial, Colorful), 0,0,0,0,0,0,0,0,0,0);{
  1222. laAddEnumItemAs(ep, "NONE", "None", "Display materials normally",0,0);
  1223. laAddEnumItemAs(ep, "COLORFUL", "Colorful", "Display material with colorful halftone",1,0);
  1224. }
  1225. ep = laAddEnumProperty(p, "as_library", "As Library", "As commom library", 0,0,0,0,0,offsetof(tnsMaterial, AsLibrary), 0,0,0,0,0,0,0,0,0,0);{
  1226. laAddEnumItemAs(ep, "NONE", "None", "Use as normal material",0,0);
  1227. laAddEnumItemAs(ep, "LIBRARY", "LIBRARY", "As commom library",1,0);
  1228. }
  1229. ep=laAddEnumProperty(p,"gradient_mode","Gradient Mode","2d gradient mode of shapes",0,0,0,0,0,offsetof(tnsMaterial,GradientMode),0,tnsset_MaterialGradientMode,0,0,0,0,0,0,0,0);
  1230. laAddEnumItemAs(ep,"NONE","None","Don't do any gradient",0,0);
  1231. laAddEnumItemAs(ep,"LINEAR","Linear","Do linear gradient",TNS_GRADIENT_MODE_LINEAR,0);
  1232. laAddEnumItemAs(ep,"BOX","Box","Do box gradient",TNS_GRADIENT_MODE_BOX,0);
  1233. laAddEnumItemAs(ep,"RADIAL","Radial","Do radial gradient",TNS_GRADIENT_MODE_RADIAL,0);
  1234. laAddFloatProperty(p,"gradient_center","Gradient Center","Starting point of the gradient",0,0,0,0,0,0,0,0,offsetof(tnsMaterial,GradientCenter),0,0,2,0,0,0,0,tnsset_MaterialGradientCenter,0,0,LA_PROP_KEYABLE);
  1235. laAddFloatProperty(p,"gradient_size","Gradient Size","Size of the gradient",0,0,0,0,0,0,0,0,offsetof(tnsMaterial,GradientSize),0,0,2,0,0,0,0,tnsset_MaterialGradientSize,0,0,LA_PROP_KEYABLE);
  1236. laAddFloatProperty(p,"gradient_box_r","Corner","Corner radius of the box gradient",0,0,0,0,0,0,0,0,offsetof(tnsMaterial,GradientBoxR),0,tnsset_MaterialGradientR,0,0,0,0,0,0,0,0,LA_PROP_KEYABLE);
  1237. laAddFloatProperty(p,"gradient_box_f","Feather","Feather distance of the box gradient",0,0,0,0,0,0,0,0,offsetof(tnsMaterial,GradientBoxF),0,tnsset_MaterialGradientF,0,0,0,0,0,0,0,0,LA_PROP_KEYABLE);
  1238. laAddSubGroup(p, "shader_page", "Shader Page", "Shader page of this material","la_rack_page",0,0,0,offsetof(tnsMaterial,Page),0,0,0,0,0,0,0,LA_UDF_SINGLE|LA_HIDE_IN_SAVE);
  1239. laAddOperatorProperty(p,"refresh","Refresh","Refresh material shader","M_refresh_material_shader",L'🗘',0);
  1240. laAddOperatorProperty(p,"remove","Remove","Remove this material","M_remove_material",L'🗴',0);
  1241. }
  1242. p = laAddPropertyContainer("tns_material_slot", "Material Slot" "Material slot", 0,0,0,sizeof(tnsMaterialSlot),0,0,1);{
  1243. TNS_PC_MATERIAL_SLOT=p;
  1244. laAddStringProperty(p,"name","Name","Name of the material slot",LA_WIDGET_STRING_PLAIN,0,0,0,0,0,0,tnsget_MaterialSlotname,0,0,LA_READ_ONLY|LA_UDF_IGNORE);
  1245. laAddSubGroup(p, "material", "Material", "Material reference of this slot","tns_material",0,0,0,offsetof(tnsMaterialSlot,Material),tnsget_FirstMaterial,tnsgetactive_SlotMaterial,laget_ListNext,0,0,0,0,LA_UDF_REFER);
  1246. laAddSubGroup(p, "parent", "Parent", "Parent object","tns_object",0,0,0,offsetof(tnsMaterialSlot,Parent),0,0,0,0,0,0,0,LA_UDF_REFER|LA_READ_ONLY);
  1247. laAddIntProperty(p,"index","Index","Index of the material slot",LA_WIDGET_INT_PLAIN,0,0,0,0,0,0,0,offsetof(tnsMaterialSlot,Index),0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
  1248. laAddOperatorProperty(p,"remove","Remove","Remove this material slot","M_remove_material_slot",L'🗴',0);
  1249. }
  1250. p = laAddPropertyContainer("tns_object", "Object", "3d object item", 0,tnsui_BaseObjectProperties,sizeof(tnsObject), tnspost_Object, 0,2);{
  1251. TNS_PC_OBJECT_GENERIC=p;
  1252. laAddSubGroup(p, "base", "Base", "Object base", "tns_object",0,0,0,-1,laget_Self,0,0,0,0,0,0,LA_UDF_REFER|LA_UDF_IGNORE);
  1253. laAddSubGroup(p, "__action_retarget__", "Action Retarget", "Get action retargeted instance (play duplicate)", "tns_object",0,0,0,-1,tnsget_ObjectRetarget,0,0,0,0,0,0,LA_UDF_IGNORE);
  1254. laAddStringProperty(p, "name", "Object Name", "The name of the object", 0,0,0,0,1, offsetof(tnsObject, Name), 0,0,0,0,LA_AS_IDENTIFIER);
  1255. laAddIntProperty(p,"flags","Flags","Flags",0,0,0,0,0,0,0,0,offsetof(tnsObject,Flags),0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
  1256. ep = laAddEnumProperty(p, "show", "Show", "Show object in the viewport", 0,0,0,0,0,offsetof(tnsObject, Show), 0,0,0,0,0,0,0,0,0,0);{
  1257. laAddEnumItem(ep, "false", "False", "False", U'🌔');
  1258. laAddEnumItem(ep, "true", "IsTrue", "IsTrue", U'🌑');
  1259. }
  1260. ep = laAddEnumProperty(p, "show_on_render", "Show On Render", "Show on render", 0,0,0,0,0,offsetof(tnsObject, ShowOnRender), 0,0,0,0,0,0,0,0,0,0);{
  1261. laAddEnumItem(ep, "false", "False", "False", U'🚫');
  1262. laAddEnumItem(ep, "true", "IsTrue", "IsTrue", U'📷');
  1263. }
  1264. ep = laAddEnumProperty(p, "type", "Type", "Object type like mesh,camera and lamp", 0,0,0,0,0,offsetof(tnsObject, Type), 0,0,0,0,0,0,0,0,0,LA_READ_ONLY);{
  1265. laAddEnumItemAs(ep, "ROOT", "Root", "Root object", TNS_OBJECT_ROOT, 0);
  1266. laAddEnumItemAs(ep, "INSTANCER", "Instancer", "Instancer object", TNS_OBJECT_INSTANCER, 0);
  1267. laAddEnumItemAs(ep, "CAMERA", "Camera", "Camera object, to render a scene", TNS_OBJECT_CAMERA, U'📷');
  1268. laAddEnumItemAs(ep, "LIGHT", "Lamp", "Lamp object, to illuminate the scene", TNS_OBJECT_LIGHT, 0);
  1269. laAddEnumItemAs(ep, "MESH", "Mesh", "Mesh object, made of verts/edges/faces", TNS_OBJECT_MESH, 0);
  1270. laAddEnumItemAs(ep, "SHAPE", "Shape", "Shape object, 2d boundary", TNS_OBJECT_SHAPE, 0);
  1271. }
  1272. laAddFloatProperty(p, "location", "Location", "XYZ Location In Local Coordinates", 0,"X,Y,Z", 0,0,0,0.1, 0,0,offsetof(tnsObject, Location), 0,0,3, 0,tnsset_ObjectLocation, 0,0,0,0,0,0);
  1273. laAddFloatProperty(p, "rotation", "Rotation", "Rotation In Local Coordinates", 0,"X,Y,Z", 0,0,0,0,0,0,offsetof(tnsObject, Rotation), 0,0,3, 0,tnsset_ObjectRotation, 0,0,0,0,0,0);
  1274. laAddFloatProperty(p, "scale", "Scale", "Local Scale", 0,"X,Y,Z",0,0,0,0,1,0,offsetof(tnsObject, Scale), 0,0,3,0,tnsset_ObjectScale,0,0,0,0,0,0);
  1275. laAddFloatProperty(p, "glocation", "Global Location", "Location in global coordinates", 0,"X,Y,Z", 0,0,0,0.1, 0,0,offsetof(tnsObject, GLocation), 0,0,3, 0,0,0,0,0,0,0,LA_READ_ONLY);
  1276. laAddFloatProperty(p, "grotation", "Global Rotation", "Rotation in global coordinates", 0,"X,Y,Z", 0,0,0,0,0,0,offsetof(tnsObject, GRotation), 0,0,3, 0,0,0,0,0,0,0,LA_READ_ONLY);
  1277. laAddFloatProperty(p, "gscale", "Global Scale", "Global scale", 0,"X,Y,Z",0,0,0,0,1,0,offsetof(tnsObject, GScale), 0,0,3,0,0,0,0,0,0,0,LA_READ_ONLY);
  1278. laAddFloatProperty(p, "dlocation", "Delta Location", "XYZ delta transforms", 0,"X,Y,Z", 0,0,0,0.1, 0,0,offsetof(tnsObject, DLocation), 0,0,3,0,0,0,0,tnsset_ObjectDLocationARR,0,0,LA_PROP_KEYABLE);
  1279. laAddFloatProperty(p, "drotation", "Delta Rotation", "Delta rotation", 0,"X,Y,Z", 0,0,0,0,0,0,offsetof(tnsObject, DRotation), 0,0,3,0,0,0,0,tnsset_ObjectDRotationARR,0,0,LA_PROP_KEYABLE|LA_PROP_ROTATION);
  1280. laAddFloatProperty(p, "dscale", "Delta Scale", "Delta scale", 0,"X,Y,Z",0,0,0,0,1,0,offsetof(tnsObject, DScale), 0,0,3,0,0,0,0,tnsset_ObjectDScaleARR,0,0,LA_PROP_KEYABLE);
  1281. laAddFloatProperty(p, "global_mat", "Global Matrix", "Global transformation matrix", 0,0,0,0,0,0,0,0,offsetof(tnsObject, GlobalTransform), 0,0,16, 0,0,0,0,0,0,0,LA_READ_ONLY);
  1282. laAddFloatProperty(p, "local_mat", "Local Matrix", "Local transformation matrix", 0,0,0,0,0,0,0,0,offsetof(tnsObject, SelfTransform), 0,0,16, 0,0,0,0,0,0,0,LA_READ_ONLY);
  1283. ep = laAddEnumProperty(p, "rotation_mode", "Rotation Mode", "Rotation mode of this object(e.g. xyz/xzy/quaternion...)", 0,0,0,0,0,offsetof(tnsObject, RotationMode), 0,0,0,0,0,0,0,0,0,0);{
  1284. laAddEnumItem(ep, "xyz", "XYZ", "XYZ Euler Mode", 0); laAddEnumItem(ep, "xzy", "XZY", "XZY Euler Mode", 0);
  1285. laAddEnumItem(ep, "yxz", "YXZ", "YXZ Euler Mode", 0); laAddEnumItem(ep, "yzx", "YZX", "YZX Euler Mode", 0);
  1286. laAddEnumItem(ep, "zxy", "ZXY", "ZXY Euler Mode", 0); laAddEnumItem(ep, "zyx", "ZYX", "ZYX Euler Mode", 0);
  1287. laAddEnumItem(ep, "quaternion", "Quaternion", "Quaternion Mode", 0);
  1288. }
  1289. laAddSubGroup(p, "active", "Active", "Active reference", "tns_object",tnsget_ObjectType,0,0,offsetof(tnsObject, Active), 0,0,0,0,0,0,0,LA_UDF_REFER|LA_READ_ONLY);
  1290. laAddSubGroup(p, "in_root", "In Root", "Root object of this object", "tns_object",0,0,0,offsetof(tnsObject, InRoot), 0,0,0,0,0,0,0,LA_UDF_REFER);
  1291. laAddSubGroup(p, "parent", "Parent", "Object parent", "tns_object",0,0,0,offsetof(tnsObject, ParentObject), 0,0,0,0,0,0,0,LA_UDF_REFER);
  1292. laAddSubGroup(p, "children", "Children", "The Children Of This Object", "tns_child_object",0,0,0,-1, 0,0,0,0,0,0,offsetof(tnsObject, ChildObjects), 0);
  1293. laAddSubGroup(p, "drivers", "Drivers", "Driver page collection","la_driver_collection",0,0,0,offsetof(tnsObject,Drivers),0,0,0,0,0,0,0,LA_UDF_SINGLE|LA_HIDE_IN_SAVE);
  1294. laAddOperatorProperty(p, "add_driver_page", "Add Page", "Add a driver page","LA_add_driver_page",'+',0);
  1295. laAddSubGroup(p, "as_mesh", "As Mesh", "As mesh object", "tns_mesh_object",0,0,0,-1,0,tnsget_ObjectAsMesh,0,0,0,0,0,LA_UDF_REFER|LA_READ_ONLY|LA_UDF_IGNORE);
  1296. laAddSubGroup(p, "as_root_object", "As Root Object", "As root object", "tns_root_object",0,0,0,-1,0,tnsget_ObjectAsRoot,0,0,0,0,0,LA_UDF_REFER|LA_READ_ONLY|LA_UDF_IGNORE);
  1297. }
  1298. p = laAddPropertyContainer("tns_root_object", "Root Object", "Root object", 0, tnsui_RootObjectProperties,sizeof(tnsRootObject), 0,0,2);{
  1299. laPropContainerExtraFunctions(p,0,0,tnstouched_Object,tnspropagate_Object,tnsui_RootObjectMenuUi);
  1300. laContainerAnimationFunctions(p,laaction_VerifyRootObject);
  1301. TNS_PC_OBJECT_ROOT=p;
  1302. laAddStringProperty(p, "name", "Object Name", "The name of the object", 0,0,0,0,1, offsetof(tnsObject, Name), 0,0,0,0,LA_AS_IDENTIFIER);
  1303. laAddSubGroup(p, "base", "Base", "Object base", "tns_object",0,0,0,0,0,0,0,0,0,0,0,LA_UDF_LOCAL);
  1304. laAddSubGroup(p, "__actions__", "Actions", "Animation actions", "la_animation_action",0,0,0,-1,0,laget_CurrentAnimationAction,0,laset_CurrentAnimationAction,0,0,offsetof(tnsRootObject, Actions), 0);
  1305. laAddSubGroup(p, "__action_props__", "Action Props", "Action properties", "la_animation_prop",0,0,0,-1,0,0,0,0,0,0,offsetof(tnsRootObject, ActionProps), 0);
  1306. laAddSubGroup(p, "active_camera", "Active Camera", "Active camera of this root object", "tns_object",0,0,0,offsetof(tnsRootObject, ActiveCamera),tnsget_CameraInRoot,0,tnsgetnext_CameraInRoot,0,0,0,0,LA_UDF_REFER);
  1307. ep = laAddEnumProperty(p, "is_2d", "Is 2D", "Is 2d root object", 0,0,0,0,0,offsetof(tnsRootObject, Is2D), 0,tnsset_RootObjectIs2D,0,0,0,0,0,0,0,0);{
  1308. laAddEnumItemAs(ep, "3D", "3D", "Root object is in 3D", 0, 0);
  1309. laAddEnumItemAs(ep, "2D", "2D", "Root object is in 2D", 1, 0);
  1310. }
  1311. laAddOperatorProperty(p, "remove_root", "Remove root", "Remove the root node","M_remove_root",L'🗴',0);
  1312. //laAddSubGroup(p, "as_root_object", "As Root Object", "As root object", "tns_root_object",0,0,0,-1,0,tnsget_ObjectAsRoot,0,0,0,0,0,LA_UDF_REFER|LA_READ_ONLY|LA_UDF_IGNORE);
  1313. }
  1314. p = laAddPropertyContainer("tns_instancer", "Instancer", "Instance placeholder object", U'📎', tnsui_InstancerObjectProperties,sizeof(tnsInstancer), 0,0,2);{
  1315. laPropContainerExtraFunctions(p,0,0,tnstouched_Object,0/*tnspropagate_Object*/,0);
  1316. TNS_PC_OBJECT_INSTANCER=p;
  1317. laAddStringProperty(p, "name", "Object Name", "The name of the object", 0,0,0,0,1, offsetof(tnsObject, Name), 0,0,0,0,LA_AS_IDENTIFIER);
  1318. laAddSubGroup(p, "base", "Base", "Object base", "tns_object",0,0,0,0,0,0,0,0,0,0,0,LA_UDF_LOCAL);
  1319. laAddSubGroup(p, "instance", "Instance", "Root object to be referenced", "tns_object",0,0,0,offsetof(tnsInstancer, Instance),tnsget_detached_FirstRootObject,0,laget_ListNext,tnsset_InstancerInstance,0,0,0,LA_UDF_REFER);
  1320. ep = laAddEnumProperty(p, "hook", "Hook", "Hook position of the 2d instance", 0,0,0,0,0,offsetof(tnsInstancer, Hook), 0,tnsset_InstancerHook,0,0,0,0,0,0,0,0);{
  1321. laAddEnumItemAs(ep, "NONE", "None", "Doesn't hook to anything, use instancer x,y coordinates", 0, 0);
  1322. laAddEnumItemAs(ep, "TL", "Top Left", "Hook to top left", TNS_INSTANCER_HOOK_TL, L'🡤');
  1323. laAddEnumItemAs(ep, "TC", "Top Center", "Hook to top center", TNS_INSTANCER_HOOK_TC, L'🡡');
  1324. laAddEnumItemAs(ep, "TR", "Top Right", "Hook to top right", TNS_INSTANCER_HOOK_TR, L'🡥');
  1325. laAddEnumItemAs(ep, "CL", "Center Left", "Hook to center left", TNS_INSTANCER_HOOK_CL, L'🡠');
  1326. laAddEnumItemAs(ep, "CC", "Center", "Hook to center", TNS_INSTANCER_HOOK_CC, L'🞆');
  1327. laAddEnumItemAs(ep, "CR", "Center Right", "Hook to center right", TNS_INSTANCER_HOOK_CR, L'🡢');
  1328. laAddEnumItemAs(ep, "BL", "Bottom Left", "Hook to bottom left", TNS_INSTANCER_HOOK_BL, L'🡧');
  1329. laAddEnumItemAs(ep, "BC", "Bottom Center", "Hook to bottom center", TNS_INSTANCER_HOOK_BC, L'🡣');
  1330. laAddEnumItemAs(ep, "BR", "Bottom Right", "Hook to bottom right", TNS_INSTANCER_HOOK_BR, L'🡦');
  1331. }
  1332. laAddFloatProperty(p, "hook_offset", "Hook Offset", "Offset of the 2d hook point", 0,0,"X,Y",0,0,0,0,0,offsetof(tnsInstancer, HookOffset),0,0,2,0,0,0,0,tnssetarr_InstancerHookOffset,0,0,LA_PROP_KEYABLE);
  1333. }
  1334. p = laAddPropertyContainer("tns_mesh_object", "Mesh Object", "Mesh object", 0,tnsui_MeshObjectProperties,sizeof(tnsMeshObject), tnspost_Object, 0,2);{
  1335. laPropContainerExtraFunctions(p,0,0,tnstouched_Object,0/*tnspropagate_Object*/,0);
  1336. TNS_PC_OBJECT_MESH=p;
  1337. laAddStringProperty(p, "name", "Object Name", "The name of the object", 0,0,0,0,1, offsetof(tnsObject, Name), 0,0,0,0,LA_AS_IDENTIFIER);
  1338. laAddSubGroup(p, "base", "Base", "Object base", "tns_object",0,0,0,0,0,0,0,0,0,0,0,LA_UDF_LOCAL);
  1339. ep = laAddEnumProperty(p, "mode", "Mode", "Mesh object mode", 0,0,0,0,0,offsetof(tnsMeshObject, Mode), 0,0,0,0,0,0,0,0,0,0);{
  1340. laAddEnumItemAs(ep, "OBJECT", "Object", "Object mode", TNS_MESH_OBJECT_MODE, 0);
  1341. laAddEnumItemAs(ep, "EDIT", "Edit", "Edit mode", TNS_MESH_EDIT_MODE, 0);
  1342. }
  1343. laAddSubGroup(p, "mv", "MMesh Verts", "Vertices of editing mesh", "tns_mvert",0,0,0,-1, 0,0,0,0,0,0,offsetof(tnsMeshObject, mv), 0);
  1344. laAddSubGroup(p, "me", "MMesh Edges", "Edges of editing mesh", "tns_medge",0,0,0,-1, 0,0,0,0,0,0,offsetof(tnsMeshObject, me), 0);
  1345. laAddSubGroup(p, "mf", "MMesh Faces", "Faces of editing mesh", "tns_mface",0,0,0,-1, 0,0,0,0,0,0,offsetof(tnsMeshObject, mf), 0);
  1346. laAddIntProperty(p, "totmv", "MVert Count", "Total mvert", 0,0,0,0,0,0,0,0,offsetof(tnsMeshObject, totmv),0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
  1347. laAddIntProperty(p, "totme", "MEdge Count", "Total medge", 0,0,0,0,0,0,0,0,offsetof(tnsMeshObject, totme),0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
  1348. laAddIntProperty(p, "totmf", "MFace Count", "Total mface", 0,0,0,0,0,0,0,0,offsetof(tnsMeshObject, totmf),0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
  1349. laAddIntProperty(p, "totv", "Vert Count", "Total vert", 0,0,0,0,0,0,0,0,offsetof(tnsMeshObject, totv),0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
  1350. laAddIntProperty(p, "tote", "Edge Count", "Total edge", 0,0,0,0,0,0,0,0,offsetof(tnsMeshObject, tote),0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
  1351. laAddIntProperty(p, "totf", "Face Count", "Total face", 0,0,0,0,0,0,0,0,offsetof(tnsMeshObject, totf),0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
  1352. laAddRawProperty(p, "v", "Verts", "Verts", offsetof(tnsMeshObject, v), tnsget_MeshObjectVertSize, 0,0,LA_READ_ONLY);
  1353. laAddRawProperty(p, "e", "Edges", "Edges", offsetof(tnsMeshObject, e), tnsget_MeshObjectEdgeSize, 0,0,LA_READ_ONLY);
  1354. laAddRawProperty(p, "f", "Faces", "Faces", offsetof(tnsMeshObject, f), 0,tnsget_MeshObjectFaceRaw, tnsset_MeshObjectFaceRaw, LA_READ_ONLY);
  1355. //laAddIntProperty(p, "maxv", "Max Vert", "Max vert count", 0,0,0,0,0,0,0,0,offsetof(tnsMeshObject, maxv),0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
  1356. //laAddIntProperty(p, "maxe", "Max Edge", "Max edge count", 0,0,0,0,0,0,0,0,offsetof(tnsMeshObject, maxe),0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
  1357. //laAddIntProperty(p, "maxf", "Max Face", "Max face count", 0,0,0,0,0,0,0,0,offsetof(tnsMeshObject, maxf),0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
  1358. laAddSubGroup(p, "current_material", "Current Material", "Current material slot in this object", "tns_material_slot",0,0,0,offsetof(tnsMeshObject, CurrentMaterial),tnsget_FirstMaterialSlot,0,laget_ListNext,0,0,0,0,LA_UDF_REFER);
  1359. laAddSubGroup(p, "materials", "Materials", "Material slots in this mesh object", "tns_material_slot",0,0,0,-1,0,tnsget_ActiveMaterialSlot,0,tnsset_ActiveMaterialSlot,0,0,offsetof(tnsMeshObject, Materials),0);
  1360. laAddOperatorProperty(p,"add_material_slot","Add Material Slot","Add a material slot into this object","M_new_material_slot",L'+',0);
  1361. laAddOperatorProperty(p,"add_material","Add Material","Add a new material to this material slot","M_new_material",'+',0);
  1362. laAddOperatorProperty(p,"assign_material_slot","Assign Material Slot","Assign faces to a current slot","M_assign_material_slot",L'🖌',0);
  1363. }
  1364. p = laAddPropertyContainer("tns_camera", "Camera", "Camera object", U'📷', tnsui_CameraObjectProperties,sizeof(tnsCamera), 0,0,2);{
  1365. //laPropContainerExtraFunctions(p,0,0,0,tnspropagate_Object,0);
  1366. TNS_PC_OBJECT_CAMERA=p;
  1367. laAddStringProperty(p, "name", "Object Name", "The name of the object", 0,0,0,0,1, offsetof(tnsObject, Name), 0,0,0,0,LA_AS_IDENTIFIER);
  1368. laAddSubGroup(p, "base", "Base", "Object base", "tns_object",0,0,0,0,0,0,0,0,0,0,0,LA_UDF_LOCAL);
  1369. ep = laAddEnumProperty(p, "camera_type", "Camera Type", "Type of a camera, like perspective or fisheye", 0,0,0,0,0,offsetof(tnsCamera, CameraType), 0,0,0,0,0,0,0,0,0,0);{
  1370. laAddEnumItem(ep, "PERSP", "Perspective", "Camera in linear perspective", 0);
  1371. laAddEnumItem(ep, "ORTHO", "Orthographic", "Camera in orthographic view", 0);
  1372. }
  1373. laAddFloatProperty(p, "fov", "FOV", "Field of view", 0,0,"^", rad(160), rad(1), rad(0.1), rad(60), 0,offsetof(tnsCamera, FOV), 0,0,0,0,0,0,0,0,0,0,LA_RAD_ANGLE);
  1374. laAddFloatProperty(p, "depth_range", "Depth Range", "Depth Range To Map From 0 To 1", 0,"Near,far", 0,0,0,0.1, 0,0,offsetof(tnsCamera, ZMin), 0,0,2, 0,0,0,0,0,0,0,0);
  1375. laAddFloatProperty(p, "focus_distance", "Focus Distance", "For viewing camera to determin zooming center", 0,0,0,0,0,0.1, 100,0,offsetof(tnsCamera, FocusDistance), 0,0,0,0,0,0,0,0,0,0,0);
  1376. laAddFloatProperty(p, "orth_scale", "Scale", "Orthographical Camera Scale", 0,0,"^^", 1000,0.001, 0.1, 1, 0,offsetof(tnsCamera, OrthScale), 0,0,0,0,0,0,0,0,0,0,0);
  1377. //laAddOperatorProperty(p, "set_active", "Set Active", "Set this camera as the active one", "Tns_set_active_camera", 0,0);
  1378. }
  1379. p = laAddPropertyContainer("tns_light", "Light", "Light object", U'🔅', tnsui_LightObjectProperties,sizeof(tnsLight), 0,0,2);{
  1380. //laPropContainerExtraFunctions(p,0,0,0,tnspropagate_Object,0);
  1381. TNS_PC_OBJECT_LIGHT=p;
  1382. laAddStringProperty(p, "name", "Object Name", "The name of the object", 0,0,0,0,1, offsetof(tnsObject, Name), 0,0,0,0,LA_AS_IDENTIFIER);
  1383. laAddSubGroup(p, "base", "Base", "Object base", "tns_object",0,0,0,0,0,0,0,0,0,0,0,LA_UDF_LOCAL);
  1384. ep = laAddEnumProperty(p, "unidirectional", "UniDirectional", "Unidirectional lighting", 0,0,0,0,0,offsetof(tnsLight, UniDirectional), 0,0,0,0,0,0,0,0,0,0);{
  1385. laAddEnumItem(ep, "NONE", "Perspective", "Camera in linear perspective", 0);
  1386. laAddEnumItem(ep, "orthographic", "Orthographic", "Camera in orthographic view", 0);
  1387. }
  1388. }
  1389. p = laAddPropertyContainer("tns_shape_object", "Shape Object", "Shape object", 0,tnsui_ShapeObjectProperties,sizeof(tnsShapeObject), tnspost_Object, 0,2);{
  1390. laPropContainerExtraFunctions(p,0,0,tnstouched_Object,0/*tnspropagate_Object*/,0);
  1391. TNS_PC_OBJECT_SHAPE=p;
  1392. laAddStringProperty(p, "name", "Object Name", "The name of the object", 0,0,0,0,1, offsetof(tnsObject, Name), 0,0,0,0,LA_AS_IDENTIFIER);
  1393. laAddSubGroup(p, "base", "Base", "Object base", "tns_object",0,0,0,0,0,0,0,0,0,0,0,LA_UDF_LOCAL);
  1394. ep = laAddEnumProperty(p, "mode", "Mode", "Shape object mode", 0,0,0,0,0,offsetof(tnsShapeObject, Mode),0,0,0,0,0,0,0,0,0,0);{
  1395. laAddEnumItemAs(ep, "OBJECT", "Object", "Object mode", TNS_MESH_OBJECT_MODE, 0);
  1396. laAddEnumItemAs(ep, "EDIT", "Edit", "Edit mode", TNS_MESH_EDIT_MODE, 0);
  1397. }
  1398. ep = laAddEnumProperty(p, "backdrop", "Backdrop", "Draw shape as backdrop", 0,0,0,0,0,offsetof(tnsShapeObject, Backdrop),0,tnsset_ShapeObjectBackdrop,0,0,0,0,0,0,0,0);{
  1399. laAddEnumItemAs(ep, "NONE", "None", "Draw shape on top of stuff", 0, 0);
  1400. laAddEnumItemAs(ep, "BACKDROP", "Backdrop", "Draw shape as backdrop", 1, 0);
  1401. }
  1402. laAddSubGroup(p, "shapes", "Shapes", "Shapes inside of the object", "tns_shape",0,0,0,-1,0,0,0,0,0,0,offsetof(tnsShapeObject, Shapes), 0);
  1403. laAddSubGroup(p, "current_material", "Current Material", "Current material slot in this object", "tns_material_slot",0,0,0,offsetof(tnsShapeObject, CurrentMaterial),tnsget_FirstMaterialSlot,0,laget_ListNext,0,0,0,0,LA_UDF_REFER);
  1404. laAddSubGroup(p, "materials", "Materials", "Material slots in this mesh object", "tns_material_slot",0,0,0,-1,0,tnsget_ActiveMaterialSlot,0,tnsset_ActiveMaterialSlot,0,0,offsetof(tnsShapeObject, Materials),0);
  1405. laAddOperatorProperty(p,"add_material_slot","Add Material Slot","Add a material slot into this object","M_new_material_slot",L'+',0);
  1406. laAddOperatorProperty(p,"add_material","Add Material","Add a new material to this material slot","M_new_material",'+',0);
  1407. laAddOperatorProperty(p,"assign_material_slot","Assign Material Slot","Assign shapes to a current slot","M_assign_material_slot",L'🖌',0);
  1408. }
  1409. p = laAddPropertyContainer("tns_mvert", "MVert", "MMesh vert", 0,0,sizeof(tnsMVert), 0,0,0);{
  1410. laAddFloatProperty(p, "p", "Position", "Position", 0,"X,Y,Z", 0,0,0,0,0,0,offsetof(tnsMVert, p),0,0,3,0,0,0,0,0,0,0,0);
  1411. laAddFloatProperty(p, "n", "Normal", "Normal", 0,"X,Y,Z", 0,0,0,0,0,0,offsetof(tnsMVert, n),0,0,3,0,0,0,0,0,0,0,0);
  1412. laAddIntProperty(p,"i","Index","Index",0,0,0,0,0,0,0,0,offsetof(tnsMVert, i),0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
  1413. laAddIntProperty(p,"flags","Flags","Flags",0,0,0,0,0,0,0,0,offsetof(tnsMVert, flags),0,0,0,0,0,0,0,0,0,0,0);
  1414. laAddSubGroup(p, "elink", "Edge Link", "Edge link", "tns_medge_link",0,0,0,-1,0,0,0,0,0,0,offsetof(tnsMVert, elink),0);
  1415. }
  1416. p = laAddPropertyContainer("tns_medge", "MEdge", "MMesh edge", 0,0,sizeof(tnsMEdge), 0,0,0);{
  1417. laAddIntProperty(p,"i","Index","Index",0,0,0,0,0,0,0,0,offsetof(tnsMEdge, i),0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
  1418. laAddIntProperty(p,"flags","Flags","Flags",0,0,0,0,0,0,0,0,offsetof(tnsMEdge, flags),0,0,0,0,0,0,0,0,0,0,0);
  1419. laAddSubGroup(p, "vl", "vl", "Left vert", "tns_mvert",0,0,0,offsetof(tnsMEdge, vl),0,0,0,0,0,0,0,LA_UDF_REFER);
  1420. laAddSubGroup(p, "vr", "vr", "Right vert", "tns_mvert",0,0,0,offsetof(tnsMEdge, vr),0,0,0,0,0,0,0,LA_UDF_REFER);
  1421. laAddSubGroup(p, "fl", "fl", "Left face", "tns_mface",0,0,0,offsetof(tnsMEdge, fl),0,0,0,0,0,0,0,LA_UDF_REFER);
  1422. laAddSubGroup(p, "fr", "fr", "Right face", "tns_mface",0,0,0,offsetof(tnsMEdge, fr),0,0,0,0,0,0,0,LA_UDF_REFER);
  1423. }
  1424. p = laAddPropertyContainer("tns_mface", "MFace", "MMesh face", 0,0,sizeof(tnsMFace), 0,0,0);{
  1425. laAddIntProperty(p,"i","Index","Index",0,0,0,0,0,0,0,0,offsetof(tnsMFace, i),0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
  1426. laAddIntProperty(p,"flags","Flags","Flags",0,0,0,0,0,0,0,0,offsetof(tnsMFace, flags),0,0,0,0,0,0,0,0,0,0,0);
  1427. laAddSubGroup(p, "l", "Loop", "Loop", "tns_loop",0,0,0,-1,0,0,0,0,0,0,offsetof(tnsMFace, l),0);
  1428. laAddIntProperty(p,"looplen","Loop Length","Loop length",0,0,0,0,0,0,0,0,offsetof(tnsMFace, looplen),0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY)->ElementBytes=2;
  1429. laAddIntProperty(p,"mat","Material","Material of this face",0,0,0,0,0,0,0,0,offsetof(tnsMFace, mat),0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY)->ElementBytes=2;
  1430. laAddFloatProperty(p, "n", "Normal", "Normal", 0,"X,Y,Z", 0,0,0,0,0,0,offsetof(tnsMFace, n),0,0,3,0,0,0,0,0,0,0,0);
  1431. //laAddFloatProperty(p, "gn", "Global Normal", "Global normal", 0,"X,Y,Z", 0,0,0,0,0,0,offsetof(tnsMFace, gn),0,0,3,0,0,0,0,0,0,0,0);
  1432. laAddFloatProperty(p, "c", "Center", "Center", 0,"X,Y,Z", 0,0,0,0,0,0,offsetof(tnsMFace, c),0,0,3,0,0,0,0,0,0,0,0);
  1433. }
  1434. p = laAddPropertyContainer("tns_medge_link", "MEdge Link", "MEdge link", 0,0,sizeof(laListItemPointer), 0,0,0);{
  1435. laAddSubGroup(p, "e", "Edge", "Edge", "tns_medge",0,0,0,offsetof(laListItemPointer, p),0,0,0,0,0,0,0,LA_UDF_REFER);
  1436. }
  1437. p = laAddPropertyContainer("tns_loop", "MFace Loop", "MFace loop", 0,0,sizeof(laListItemPointer), 0,0,0);{
  1438. laAddSubGroup(p, "e", "Edge", "Edge", "tns_medge",0,0,0,offsetof(laListItemPointer, p),0,0,0,0,0,0,0,LA_UDF_REFER);
  1439. }
  1440. p = laAddPropertyContainer("tns_shape", "Shape", "Shape data structure", 0,0,sizeof(tnsShape), 0,0,0);{
  1441. laAddIntProperty(p,"mat","Material","Material of this face",0,0,0,0,0,0,0,0,offsetof(tnsShape, mat),0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY)->ElementBytes=2;
  1442. laAddIntProperty(p,"flags","Flags","Flags",0,0,0,0,0,0,0,0,offsetof(tnsShape, flags),0,0,0,0,0,0,0,0,0,0,0);
  1443. laAddSubGroup(p, "points", "Points", "Points in this shape", "tns_spoint",0,0,0,-1,0,0,0,0,0,0,offsetof(tnsShape, Points),0);
  1444. }
  1445. p = laAddPropertyContainer("tns_spoint", "SPoint", "Shape point", 0,0,sizeof(tnsSPoint), 0,0,0);{
  1446. laAddFloatProperty(p, "p", "Position", "Position", 0,"X,Y", 0,0,0,0,0,0,offsetof(tnsSPoint, p),0,0,2,0,0,0,0,0,0,0,0);
  1447. laAddFloatProperty(p, "dl", "Delta Left", "Delta of left control point", 0,"X,Y", 0,0,0,0,0,0,offsetof(tnsSPoint, dl),0,0,2,0,0,0,0,0,0,0,0);
  1448. laAddFloatProperty(p, "dr", "Delta Right", "Delta of right control point", 0,"X,Y", 0,0,0,0,0,0,offsetof(tnsSPoint, dr),0,0,2,0,0,0,0,0,0,0,0);
  1449. laAddIntProperty(p,"flags","Flags","Flags",0,0,0,0,0,0,0,0,offsetof(tnsSPoint, flags),0,0,0,0,0,0,0,0,0,0,0);
  1450. }
  1451. }
  1452. void la_RegisterInternalProps(){
  1453. laPropContainer *p, *ip, *p2, *ip2, *sp1, *sp2;
  1454. laProp *ep; laPropPack pp; laSubProp *sp; laKeyMapper *km;
  1455. laCanvasTemplate *v2dt;
  1456. {
  1457. la_UDFAppendSharedTypePointer("_LA_ROOT_NODE_", &MAIN);
  1458. la_UDFAppendSharedTypePointer("_TNS_ROOT_NODE_", T);
  1459. // THEME ==================================================================================================
  1460. {
  1461. p = laDefineRoot();
  1462. laAddPropertyContainer("any_pointer", "Any Pointer", "A pointer that is not exposed to access", 0,0,sizeof(void*), 0,0,LA_PROP_OTHER_ALLOC);
  1463. laAddPropertyContainer("any_pointer_h2", "Any Pointer (h2)", "A pointer that is not exposed to access", 0,0,sizeof(void*), 0,0,2);
  1464. laAddSubGroup(p, "tns","TNS", "TNS Kernel Main Structure", "tns_main",0,0,0,-1, tnsget_TnsMain, 0,0,0,0,0,0,LA_UDF_SINGLE | LA_UDF_LOCAL);
  1465. laAddSubGroup(p, "la","LA", "LA Main Structure", "la_main",0,0,laui_SubPropInfoDefault, -1, laget_Main, 0,0,0,0,0,0,LA_UDF_SINGLE | LA_UDF_LOCAL);
  1466. p = laAddPropertyContainer("boxed_theme", "Boxed Theme", "A single theme item for one or multiple kinds of uiitems", 0,laui_BoxedThemeItem, sizeof(laBoxedTheme), 0,0,1);{
  1467. laAddStringProperty(p, "name", "Name", "Boxed theme name", 0,0,0,0,1, offsetof(laBoxedTheme, Name), 0,0,0,0,LA_AS_IDENTIFIER|LA_TRANSLATE);
  1468. laAddFloatProperty(p, "normal", "Normal", "Background brightness", 0,0,0,1, 0,0.025, 1, 0,offsetof(laBoxedTheme, NormalY), 0,laset_ThemeNormal, 0,0,0,0,0,0,0,0,0);
  1469. laAddFloatProperty(p, "active", "Active", "Background brightness in active state", 0,0,0,1, 0,0.025, 1, 0,offsetof(laBoxedTheme, ActiveY), 0,laset_ThemeActive, 0,0,0,0,0,0,0,0,0);
  1470. laAddFloatProperty(p, "border", "Border", "Border brightness", 0,0,0,1, 0,0.025, 1, 0,offsetof(laBoxedTheme, BorderY), 0,laset_ThemeBorder, 0,0,0,0,0,0,0,0,0);
  1471. laAddFloatProperty(p, "text", "Text", "Text brightness", 0,0,0,1, 0,0.025, 1, 0,offsetof(laBoxedTheme, TextY), 0,laset_ThemeText, 0,0,0,0,0,0,0,0,0);
  1472. laAddFloatProperty(p, "text_active", "Text Active", "Text brightness in active state", 0,0,0,1, 0,0.025, 1, 0,offsetof(laBoxedTheme, TextActiveY), 0,laset_ThemeTextActive, 0,0,0,0,0,0,0,0,0);
  1473. laAddFloatProperty(p, "alpha", "Alpha", "Background alpha", 0,0,0,1, 0,0.025, 1, 0,offsetof(laBoxedTheme, Alpha), 0,laset_ThemeAlpha, 0,0,0,0,0,0,0,0,0);
  1474. laAddSubGroup(p, "back_ref", "Back Ref", "Boxed theme internal back-ref", "any_pointer",0,0,0,offsetof(laBoxedTheme, BackRef), 0,0,0,0,0,0,0,LA_UDF_REFER);
  1475. laAddSubGroup(p, "parent", "Parent", "Parent Theme", "theme",0,0,0,offsetof(laBoxedTheme, Parent), 0,0,0,0,0,0,0,LA_UDF_REFER);
  1476. ep=laAddEnumProperty(p, "box_style","Box Style","Draw box pop up or lowered down",0,0,0,0,0,offsetof(laBoxedTheme, BoxStyle),0,laset_ThemeBoxStyle,0,0,0,0,0,0,0,0);
  1477. laAddEnumItemAs(ep,"NORMAL","Normal","Normal box",0,0);
  1478. laAddEnumItemAs(ep,"POP","Pop-up","Pop-up box",1,0);
  1479. laAddEnumItemAs(ep,"LOWERED","Lowered","Lowered box",-1,0);
  1480. ep=laAddEnumProperty(p, "text_shadow","Text Shadow","Whether to show text shadow",0,0,0,0,0,offsetof(laBoxedTheme, TextShadow),0,laset_ThemeTextShadow,0,0,0,0,0,0,0,0);
  1481. laAddEnumItemAs(ep,"NONE","None","Text doesn't have any shadow",0,0);
  1482. laAddEnumItemAs(ep,"SHADOW","Shadow","Text has shadow",1,0);
  1483. ep=laAddEnumProperty(p, "color_selection","Color Selection","Which color to use for this widget",0,0,0,0,0,offsetof(laBoxedTheme, ColorSelection),0,laset_ThemeColorSelection,0,0,0,0,0,0,0,0);
  1484. laAddEnumItemAs(ep,"SELA","A","Select Color A",0,0);
  1485. laAddEnumItemAs(ep,"SELB","B","Select Color B",1,0);
  1486. laAddEnumItemAs(ep,"SELC","C","Select Color C",2,0);
  1487. ep=laAddEnumProperty(p, "no_decal_invert","No Decal Invert","Invert text color when widget has no decal",0,0,0,0,0,offsetof(laBoxedTheme, NoDecalInvert),0,laset_ThemeNoDecalInvert,0,0,0,0,0,0,0,0);
  1488. laAddEnumItemAs(ep,"NONE","None","Don't invert text brightness when widget has no decal",0,0);
  1489. laAddEnumItemAs(ep,"INVERT","Invert","Invert text brightness when widget has no decal",1,0);
  1490. }
  1491. p = laAddPropertyContainer("theme", "Theme Package", "A package with all types of theme for ui items", 0,laui_Theme, sizeof(laTheme),0,lapostim_Theme,2);{
  1492. laPropContainerExtraFunctions(p,0,lareset_Theme,0,0,0);
  1493. laAddStringProperty(p, "name", "Name", "Theme name", 0,0,0,0,1, offsetof(laTheme, Name), 0,0,laset_ThemeName,0,LA_AS_IDENTIFIER);
  1494. laAddSubGroup(p, "boxed_themes", "Boxed Themes", "The Boxed Theme For Single UiItem Or Panel", "boxed_theme",0,0,0,-1, 0,0,0,0,0,0,offsetof(laTheme, BoxedThemes), 0);
  1495. laAddFloatProperty(p, "color", "Color A", "Base color of the theme", LA_WIDGET_FLOAT_COLOR, "R,G,B,A", 0,1, 0,0.025, 1, 0,offsetof(laTheme, Color), 0,0,4, 0,0,0,0,laset_ThemeColor, 0,0,0);
  1496. laAddFloatProperty(p, "color_b", "Color B", "Alternative (B) base color of the theme", LA_WIDGET_FLOAT_COLOR, "R,G,B,A", 0,1, 0,0.025, 1, 0,offsetof(laTheme, ColorB), 0,0,4, 0,0,0,0,laset_ThemeColorB, 0,0,0);
  1497. laAddFloatProperty(p, "color_c", "Color C", "Alternative (C) base color of the theme", LA_WIDGET_FLOAT_COLOR, "R,G,B,A", 0,1, 0,0.025, 1, 0,offsetof(laTheme, ColorC), 0,0,4, 0,0,0,0,laset_ThemeColorC, 0,0,0);
  1498. laAddFloatProperty(p, "accent_color", "Accent Color", "Theme accent color for hightlight etc", LA_WIDGET_FLOAT_COLOR, "R,G,B,A", 0,1, 0,0.025, 1, 0,offsetof(laTheme, AccentColor), 0,0,4, 0,0,0,0,laset_ThemeAccentColor, 0,0,0);
  1499. laAddFloatProperty(p, "warning_color", "Warning Color", "Theme accent color for warning etc", LA_WIDGET_FLOAT_COLOR, "R,G,B,A", 0,1, 0,0.025, 1, 0,offsetof(laTheme, WarningColor), 0,0,4, 0,0,0,0,laset_ThemeWarningColor, 0,0,0);
  1500. laAddFloatProperty(p, "inactive_saturation", "Inactive Saturation", "Reduced saturation on inactive widgets", 0,0,0,1, 0,0.025, 1, 0,offsetof(laTheme, InactiveSaturation), 0,laset_ThemeInactiveSaturation,0,0,0,0,0,0,0,0,0);
  1501. laAddFloatProperty(p, "inactive_mix", "Inactive Mix", "Reduced alpha on inactive widgets", 0,0,0,1, 0,0.025, 1, 0,offsetof(laTheme, InactiveMix),0,laset_ThemeInactiveMix,0,0,0,0,0,0,0,0,0);
  1502. laAddFloatProperty(p, "cursor_alpha", "Cursor Alpha", "Transparency of the cursor", 0,0,0,1, 0,0.025, 1, 0,offsetof(laTheme, CursorAlpha), 0,laset_ThemeCursorAlpha,0,0,0,0,0,0,0,0,0);
  1503. laAddFloatProperty(p, "selection_alpha", "Selection Alpha", "Transparency of selection backgrounds", 0,0,0,1, 0,0.025, 1, 0,offsetof(laTheme, SelectionAlpha),0,laset_ThemeSelectionAlpha,0,0,0,0,0,0,0,0,0);
  1504. laAddFloatProperty(p, "shadow_alpha", "Shadow Alpha", "Transparency of the shadow", 0,0,0,1, 0,0.025, 1, 0,offsetof(laTheme, ShadowAlpha), 0,laset_ThemeShadowAlpha,0,0,0,0,0,0,0,0,0);
  1505. laAddFloatProperty(p, "text_shadow_alpha", "Text Shadow Alpha", "Transparency of the text shadow", 0,0,0,1, 0,0.025, 1, 0,offsetof(laTheme, TextShadowAlpha), 0,laset_ThemeTextShadowAlpha,0,0,0,0,0,0,0,0,0);
  1506. laAddFloatProperty(p, "wire_transparency", "Wire Transparency", "Alpha of the wire color", 0,0,0,1, 0,0.05, 0.7, 0,offsetof(laTheme, WireTransparency), 0,laset_ThemeWireTransparency, 0,0,0,0,0,0,0,0,0);
  1507. laAddFloatProperty(p, "wire_saturation", "Wire Saturation", "Saturation of the wires", 0,0,0,1, 0,0.05, 0.8, 0,offsetof(laTheme, WireSaturation), 0,laset_ThemeWireSaturation, 0,0,0,0,0,0,0,0,0);
  1508. laAddFloatProperty(p, "wire_brightness", "Wire Brightness", "Brightness of the wires", 0,0,0,1, 0,0.05, 0.8, 0,offsetof(laTheme, WireBrightness), 0,laset_ThemeWireBrightness, 0,0,0,0,0,0,0,0,0);
  1509. laAddFloatProperty(p, "edge_transparency", "Edge Transparency", "Transparency of the edge color", 0,0,0,1, 0,0.05, 0.7, 0,offsetof(laTheme, EdgeTransparency), 0,laset_ThemeEdgeTransparency, 0,0,0,0,0,0,0,0,0);
  1510. laAddFloatProperty(p, "edge_brightness", "Edge Brightness", "Brightness of the edge color", 0,0,0,1, 0,0.05, 0.7, 0,offsetof(laTheme, EdgeBrightness), 0,laset_ThemeEdgeBrightness, 0,0,0,0,0,0,0,0,0);
  1511. laAddFloatProperty(p, "vertex_transparency", "Edge Transparency", "Transparency of the vertex color", 0,0,0,1, 0,0.05, 0.7, 0,offsetof(laTheme, VertexTransparency), 0,laset_ThemeVertexTransparency, 0,0,0,0,0,0,0,0,0);
  1512. laAddFloatProperty(p, "vertex_brightness", "Edge Brightness", "Brightness of the vertex color", 0,0,0,1, 0,0.05, 0.7, 0,offsetof(laTheme, VertexBrightness), 0,laset_ThemeVertexBrightness, 0,0,0,0,0,0,0,0,0);
  1513. laAddFloatProperty(p, "svertex_transparency", "Selected Vertex Transparency", "Transparency of selected vertices", 0,0,0,1, 0,0.05, 0.7, 0,offsetof(laTheme, SelectedVertexTransparency), 0,laset_ThemeSVertexTransparency, 0,0,0,0,0,0,0,0,0);
  1514. laAddFloatProperty(p, "sedge_transparency", "Selected Edge Transparency", "Transparency of selected edges", 0,0,0,1, 0,0.05, 0.7, 0,offsetof(laTheme, SelectedEdgeTransparency), 0,laset_ThemeSEdgeTransparency, 0,0,0,0,0,0,0,0,0);
  1515. laAddFloatProperty(p, "sface_transparency", "Selected Face Transparency", "Transparency of selected faces", 0,0,0,1, 0,0.05, 0.7, 0,offsetof(laTheme, SelectedFaceTransparency), 0,laset_ThemeSFaceTransparency, 0,0,0,0,0,0,0,0,0);
  1516. sp=laAddSubGroup(p,"preview","Preview","Theme preview","theme",0,0,0,-1,laget_Self,0,0,0,0,0,0,LA_READ_ONLY|LA_UDF_IGNORE|LA_UDF_REFER);
  1517. laSubGroupExtraFunctions(sp,0,0,laget_ThemePreviewTheme,0,0);
  1518. laAddOperatorProperty(p, "delete", "Delete", "Delete this theme", "LA_delete_theme", 0,0);
  1519. laAddOperatorProperty(p, "save_as", "Save as", "Save theme as file", "LA_udf_save_instance", U'🖫',0);
  1520. laAddOperatorProperty(p, "duplicate", "Duplicate", "Duplicate this theme", "LA_new_theme", U'⎘',0)
  1521. ->ExtraInstructions="duplicate=true;";
  1522. }
  1523. }
  1524. // TIME INFO =========================================================================================
  1525. p = laAddPropertyContainer("time_info", "Time Info", "Time information y/m/d/h/m/s", U'🕒', 0,sizeof(laTimeInfo), 0,0,LA_PROP_OTHER_ALLOC);{
  1526. laAddIntProperty(p, "year", "Year", "Year value", 0,0,0,0,0,0,0,0,0,laget_TimeYear, 0,0,0,0,0,0,0,0,0,0);
  1527. laAddIntProperty(p, "month", "Month", "Month value", 0,0,0,0,0,0,0,0,0,laget_TimeMonth, 0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
  1528. laAddIntProperty(p, "day", "Day", "Day value", 0,0,0,0,0,0,0,0,0,laget_TimeDay, 0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
  1529. laAddIntProperty(p, "hour", "Hour", "Hour value", 0,0,0,0,0,0,0,0,0,laget_TimeHour, 0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
  1530. laAddIntProperty(p, "minute", "Minute", "Minute value", 0,0,0,0,0,0,0,0,0,laget_TimeMinute, 0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
  1531. laAddIntProperty(p, "second", "Second", "Second value", 0,0,0,0,0,0,0,0,0,laget_TimeSecond, 0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
  1532. laAddStringProperty(p, "time_string", "Time String", "Full String In \"Y-M-D H:M:S\" format", 0,0,0,0,0,0,0,laget_TimeString, 0,0,LA_READ_ONLY);
  1533. }
  1534. // LA MAIN =========================================================================================
  1535. p = laAddPropertyContainer("la_main", "LA Root", "La root structure", U'🖴', 0,sizeof(LA), 0,0,2|LA_PROP_OTHER_ALLOC);{
  1536. laAddSubGroup(p, "logs", "Logs", "Application logs", "la_log",0,0,laui_LogItem, -1, 0,0,0,0,0,0,offsetof(LA, Logs), LA_UDF_IGNORE|LA_READ_ONLY);
  1537. laAddStringProperty(p, "terminal_input", "Terminal Input", "Terminal input string", 0,0,0,0,0, offsetof(LA,TerminalInput),0,0,laset_TerminalInput,0,LA_UDF_LOCAL|LA_UDF_IGNORE);
  1538. ep=laAddEnumProperty(p, "terminal_incomplete", "Terminal Incomplete", "Incomplete input pending in terminal", 0,0,0,0,0,offsetof(LA, TerminalIncomplete),0,0,0,0,0,0,0,0,0,LA_READ_ONLY|LA_UDF_IGNORE);
  1539. laAddEnumItemAs(ep, "NONE", "None", "Terminal status is normal", 0, 0);
  1540. laAddEnumItemAs(ep, "INCOMPLETE", "Incomplete", "Terminal has incomplete input pending", 1, 0);
  1541. laAddSubGroup(p, "differences", "Differences", "Difference stack (for undo/redo)", "la_difference",0,0,0,offsetof(LA, HeadDifference), 0,0,0,0,0,0,offsetof(LA, Differences), LA_UDF_IGNORE|LA_READ_ONLY);
  1542. sp=laAddSubGroup(p, "panel_templates", "Panel Templates", "Panel templates used to create new panel", "panel_template",0,0,0,-1, 0,0,0,0,0,0,offsetof(LA, PanelTemplates), 0);
  1543. _LA_PROP_WINDOW=laAddSubGroup(p, "windows", "Windows", "All windows inside this application", "ui_window",0,0,0,offsetof(LA, CurrentWindow), laget_FirstWindow, 0,laget_ListNext, 0,0,0,offsetof(LA, Windows), 0);
  1544. la_UDFAppendSharedTypePointer("_LA_PROP_WINDOW", _LA_PROP_WINDOW);
  1545. laAddSubGroup(p, "data", "Data", "Data Root Control", "property_container",0,0,0,offsetof(LA, DataRoot.Root), 0,0,0,0,0,0,0,0);
  1546. laAddSubGroup(p, "prop_containers", "Sub Type", "Sub Type Property Container", "property_container",0,0,0,-1, laget_FirstContainer, 0,laget_ListNext, 0,0,0,0,0);
  1547. laAddSubGroup(p, "managed_props", "Managed Props", "Managed properties for saving", "managed_prop",0,0,0,-1, 0,0,0,0,0,0,offsetof(LA, ManagedSaveProps), LA_UDF_IGNORE|LA_READ_ONLY);
  1548. laAddSubGroup(p, "managed_udfs", "Managed UDFs", "Managed UDFs for saving", "managed_udf", 0,0,laui_ManagedUDFOps, -1, 0,0,0,0,0,0,offsetof(LA, ManagedUDFs), LA_UDF_IGNORE|LA_READ_ONLY);
  1549. laAddSubGroup(p, "user_preferences", "User Preference", "Kernel Settings For LA Main Structure", "la_user_preference",0,0,0,-1, laget_Main, 0,0,0,0,0,0,LA_UDF_LOCAL);
  1550. laSubGroupExtraFunctions(sp,0,0,0,0,laget_PanelTemplateCategory);
  1551. sp=laAddSubGroup(p, "themes", "Themes", "Themes Loded In The Program", "theme",0,0,laui_Theme, -1, 0,laget_ActiveTheme, 0,laset_ActiveTheme, 0,0,offsetof(LA,Themes), 0);
  1552. sp=laAddSubGroup(p, "controllers", "Controllers", "Detected game controllers","la_controller",laget_ControllerType,0,0,-1,0,0,0,0,0,0,offsetof(LA,Controllers),0);
  1553. laSubGroupDetachable(sp, laget_DetachedControllerFirst, laget_ListNext);
  1554. LA_PROP_CONTROLLER=sp;
  1555. sp=laAddSubGroup(p, "node_categories", "Node Categories", "Node categories","la_node_category",0,0,0,offsetof(LA,CurrentNodeCategory),0,0,0,0,0,0,offsetof(LA,NodeCategories),0);
  1556. laSubGroupExtraFunctions(sp,lafilter_NodeCategory,0,0,0,0);
  1557. laAddSubGroup(p, "animation", "Animation", "Animation data","la_animation",0,0,0,offsetof(LA,Animation),0,0,0,0,0,0,0,LA_UDF_SINGLE);
  1558. if(MAIN.InitArgs.HasAudio) laAddSubGroup(p, "audio", "Audio", "Audio data","la_audio",0,0,0,offsetof(LA,Audio),0,0,0,0,0,0,0,LA_UDF_SINGLE);
  1559. laAddSubGroup(p,"input_mapping","Input Mapping","Input mapping bundle","la_input_mapping_bundle",0,0,0,offsetof(LA,InputMapping),0,0,0,0,0,0,0,LA_UDF_SINGLE);
  1560. laAddStringProperty(p,"signal_filter","Signal Filter","Filter displayed signals",0,0,0,0,1,offsetof(LA,SignalFilter),0,0,laset_SignalFilter,0,0);
  1561. laAddStringProperty(p,"operator_filter","Operator Filter","Filter displayed operators",0,0,0,0,1,offsetof(LA,OperatorFilter),0,0,laset_OperatorFilter,0,0);
  1562. laAddSubGroup(p,"custom_signals","Signals","Registered custom signals","la_custom_signal",0,0,laui_IdentifierOnly,-1,laget_FirstCustomSignal,0,laget_ListNext,0,0,0,0,LA_UDF_IGNORE);
  1563. laAddSubGroup(p,"filtered_signals","Filtered Signals","Filtered custom signals","la_custom_signal",0,0,laui_IdentifierOnly,-1,laget_FirstFilteredCustomSignal,0,lagetnext_FilteredSignal,0,0,0,0,LA_UDF_IGNORE);
  1564. laAddSubGroup(p,"filtered_operators","Filtered Operators","Filtered operators","la_operator_type",0,0,laui_IdentifierOnly,-1,laget_FirstFilteredOperator,0,lagetnext_FilteredOperator,0,0,0,0,LA_UDF_IGNORE);
  1565. laAddStringProperty(p, "identifier", "Identifier", "Identifier", 0,0,0,0,0,0,0,laget_MainIdentifier, 0,0,LA_AS_IDENTIFIER|LA_READ_ONLY);
  1566. laAddIntProperty(p, "example_int", "Example Integer", "Example integer", 0,0,0,100,0,1, 50,0,offsetof(LA, example_int), 0,0,0,0,0,0,0,0,0,0,0);
  1567. laAddStringProperty(p, "example_string", "Example String", "Example string", 0,0,0,0,1, offsetof(LA,example_string), 0,0,0,0,0);
  1568. laAddStringProperty(p, "unknown_prop", "Unknown Property", "Placeholder for unknown property, probably due to a wrong property path, or not setting LA_AS_IDENTIFIER in any of the properties.",
  1569. LA_WIDGET_STRING_PLAIN, 0,0,0,0,0,0,laget_UnknownPropertyString, 0,0,LA_READ_ONLY);
  1570. ep=laAddEnumProperty(p, "detached_view_switch", "View Detached", "Use detached view on panels", LA_WIDGET_ENUM_HIGHLIGHT,0,0,0,0,offsetof(LA, DetachedViewSwitch),0,0,0,0,0,0,0,0,0,LA_UDF_IGNORE);
  1571. laAddEnumItemAs(ep, "LINKED", "Linked", "View is linked to global current states", 0, U'🔗');
  1572. laAddEnumItemAs(ep, "DETACHED", "Detached", "View is detached from global states and is pinned to panel", 1, U'📌');
  1573. }
  1574. if(MAIN.InitArgs.HasAudio){
  1575. p = laAddPropertyContainer("la_audio", "Audio", "Audio management", 0,0, sizeof(laAudio), 0,0,1);{
  1576. laAddSubGroup(p,"synths","Synthesizers","Synthesizers","la_synth",0,0,0,-1,0,0,0,0,0,0,offsetof(laAudio,Synths),0);
  1577. sp=laAddSubGroup(p, "current_synth", "Current Synthesizer", "Current synthesizer","la_synth",0,0,0,offsetof(laAudio,CurrentSynth),laget_FirstSynth,0,laget_ListNext,laset_CurrentSynth,0,0,0,LA_UDF_REFER);
  1578. laSubGroupDetachable(sp,laget_FirstSynth,laget_ListNext);
  1579. laAddSubGroup(p,"audio_devices","Audio Devices","Enumerated audio devices","la_audio_device",0,0,0,-1,0,0,0,0,0,0,offsetof(laAudio,AudioDevices),LA_UDF_IGNORE);
  1580. laAddSubGroup(p, "current_audio_device", "Current Audio Device", "Current audio device","la_audio_device",0,0,0,offsetof(laAudio,UsingDevice),laget_FirstAudioDevice,0,laget_ListNext,laset_CurrentAudioDevice,0,0,0,LA_UDF_REFER|LA_UDF_IGNORE);
  1581. laAddSubGroup(p,"channels","Channels","Audio channels","la_audio_channel",0,0,0,-1,0,0,0,0,0,0,offsetof(laAudio,Channels),0);
  1582. ep=laAddEnumProperty(p,"backend","Backend","Audio backend",0,0,0,ma_backend_null,0,offsetof(laAudio,MiniAudioBackend),0,laset_MiniAudioBackend,0,0,0,0,0,0,0,0);
  1583. laAddEnumItemAs(ep,"AUTO","Auto","Automatic backend selection",ma_backend_null,0);
  1584. laAddEnumItemAs(ep,"JACK","Jack","Jack backend",ma_backend_jack,0);
  1585. #ifdef LA_LINUX
  1586. laAddEnumItemAs(ep,"PULSEAUDIO","Pulseaudio","Pulseaudio backend",ma_backend_pulseaudio,0);
  1587. laAddEnumItemAs(ep,"ALSA","Alsa","Alsa backend",ma_backend_alsa,0);
  1588. #endif
  1589. #ifdef _WIN32
  1590. laAddEnumItemAs(ep,"WASAPI","WASAPI"," WASAPI backend",ma_backend_wasapi,0);
  1591. laAddEnumItemAs(ep,"DIRECTSOUND","DirectSound","DirectSound backend",ma_backend_dsound, 0);
  1592. laAddEnumItemAs(ep,"WINMM","WinMM","WinMM backend",ma_backend_winmm,0);
  1593. #endif
  1594. #ifdef LAGUI_ANDROID
  1595. laAddEnumItemAs(ep,"AAUDIO","AAudio"," AAudio backend",ma_backend_aaudio,0);
  1596. laAddEnumItemAs(ep,"OpenSL ES","OpenSL ES","OpenSL ES backend",ma_backend_opensl,0);
  1597. #endif
  1598. }
  1599. }
  1600. p = laAddPropertyContainer("la_node_category", "Node Category", "Node category", 0,laui_IdentifierOnly, sizeof(laNodeCategory), 0,0,1);{
  1601. laAddStringProperty(p, "name", "Name", "Name of the page", 0,0,0,0,1, offsetof(laNodeCategory, Name), 0,0,0,0,LA_AS_IDENTIFIER|LA_TRANSLATE);
  1602. laAddIntProperty(p, "for_racks", "For Rack Types", "For rack types", 0,0,0,0,0,0,0,0,offsetof(laNodeCategory, For), 0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
  1603. }
  1604. p = laAddPropertyContainer("la_driver_collection", "Driver Collection", "Driver collection", 0,0,sizeof(laRackPageCollection), 0,0,1);{
  1605. laAddSubGroup(p, "pages", "Pages", "Rack pages","la_rack_page",0,0,0,-1,0,laget_CurrentRackPage,0,0,0,0,offsetof(laRackPageCollection,Pages),0);
  1606. sp=laAddSubGroup(p, "current_page", "Current Page", "Current page","la_rack_page",0,0,0,offsetof(laRackPageCollection,CurrentPage),laget_FirstDriverPage,0,laget_ListNext,laset_CurrentRackPage,0,0,0,LA_UDF_REFER);
  1607. //laSubGroupDetachable(sp,laget_FirstDriverPage,laget_ListNext);
  1608. }
  1609. p = laAddPropertyContainer("la_rack_page", "Rack Page", "A page of nodes", 0,laui_IdentifierOnly, sizeof(laRackPage),lapost_RackPage,0,1);{
  1610. LA_PC_RACK_PAGE = p;
  1611. laPropContainerExtraFunctions(p,0,lareset_RackPage,0,0,0);
  1612. laAddStringProperty(p, "name", "Name", "Name of the page", 0,0,0,0,1, offsetof(laRackPage, Name), 0,0,0,0,LA_AS_IDENTIFIER);
  1613. laAddIntProperty(p,"type", "Type", "Type of the rack", 0,0,0,0,0,0,0,0,offsetof(laRackPage,RackType),0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
  1614. laAddIntProperty(p,"has_rack", "Has Rack", "Has rack", 0,0,0,0,0,0,0,0,offsetof(laRackPage,Racks.pFirst),0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY|LA_UDF_IGNORE);
  1615. laAddSubGroup(p, "racks", "Racks", "Racks for nodes","la_node_rack",0,0,0,-1,0,0,0,0,0,0,offsetof(laRackPage,Racks),0);
  1616. if(MAIN.InitArgs.HasWorldObjects){
  1617. laAddSubGroup(p, "parent_object", "Parent Object", "Parent object of this page","tns_object",0,0,0,offsetof(laRackPage,ParentObject),0,0,0,0,0,0,0,LA_READ_ONLY|LA_UDF_REFER);
  1618. }
  1619. ep=laAddEnumProperty(p, "trigger", "Trigger", "Trigger evaluation on event",0,0,0,0,0,offsetof(laRackPage,TriggerMode),0,0,0,0,0,0,0,0,0,0);
  1620. laAddEnumItemAs(ep, "PROCESS", "onProcess", "Run this page during idle frame processing of the node",TNS_PAGE_TRIGGER_PROCESS,0);
  1621. laAddEnumItemAs(ep, "KEYBOARD", "onKeyboard", "This page is run when keyboard event is recieved",TNS_PAGE_TRIGGER_KEYBOARD,0);
  1622. laAddEnumItemAs(ep, "MOUSE", "onMouse", "This page is run when mouse event is recieved",TNS_PAGE_TRIGGER_KEYBOARD,0);
  1623. laAddEnumItemAs(ep, "CONTROLLER", "onController", "This page is run when controller event is recieved",TNS_PAGE_TRIGGER_KEYBOARD,0);
  1624. ep=laAddEnumProperty(p, "use_script", "Use Script", "Use script instead of nodes",0,0,0,0,0,offsetof(laRackPage,UseScript),0,0,0,0,0,0,0,0,0,0);
  1625. laAddEnumItemAs(ep, "NODES", "Nodes", "Use nodes to express logic",0,0);
  1626. laAddEnumItemAs(ep, "SCRIPT", "Script", "Use scripts to express logic",1,L'📃');
  1627. laAddStringProperty(p, "script", "Script", "Script content",LA_WIDGET_STRING_MULTI,0,0,0,1,offsetof(laRackPage, Script), 0,0,0,0,0);
  1628. laAddOperatorProperty(p,"add_rack","Add Rack", "Add a rack into the page", "LA_add_rack", '+', 0);
  1629. laAddOperatorProperty(p,"remove_driver_page","Remove Page", "Remove this page", "LA_remove_driver_page", L'🗴', 0);
  1630. }
  1631. //p = laAddPropertyContainer("udf_fail_node", "UDF Failed Node", "Single wild data block reference", laui_UDFFailNodeItem, sizeof(laUDFFailNode), 0,0,0,0,0); {
  1632. // laAddSubGroup(p, "instance", "Instance", "Actual Data Block Instance", "property_trash_item",0,0,0 Item.p), 0,0,0,0,0,0,0,0,
  1633. // 0,0,
  1634. // 0);
  1635. // laAddSubGroup(p, "target_container", "Target Container", "The Container The Data Block Belongs To", "property_container",0,0,0 pc), 0,0,0,0,0,0,0,0,
  1636. // 0,0,
  1637. // 0);
  1638. //}
  1639. p = laAddPropertyContainer("la_difference", "Difference", "A difference stack item (undo/redo).", 0,laui_IdentifierOnly, sizeof(laDiff), 0,0,1);{
  1640. laAddStringProperty(p, "description", "Description", "Description of this recorded change", LA_WIDGET_STRING_PLAIN, 0,0,0,1, offsetof(laDiff, Description), 0,0,0,0,LA_READ_ONLY|LA_AS_IDENTIFIER);
  1641. }
  1642. p = laAddPropertyContainer("la_log", "Resource Folder", "A resource folder to search for UDF references.", 0,laui_ResourceFolderItem, sizeof(laLogEntry), 0,0,1);{
  1643. laAddStringProperty(p, "content", "Content", "Content of the log", LA_WIDGET_STRING_PLAIN, 0,0,0,1, offsetof(laLogEntry, Content), 0,0,0,0,LA_READ_ONLY);
  1644. }
  1645. p = laAddPropertyContainer("la_resource_folder", "Resource Folder", "A resource folder to search for UDF references.", 0,laui_ResourceFolderItem, sizeof(laResourceFolder), 0,0,1);{
  1646. laAddStringProperty(p, "path", "Path", "Path", 0,0,0,0,1, offsetof(laResourceFolder, Path), 0,0,laset_ResourcePath, 0,0);
  1647. laAddOperatorProperty(p, "remove", "Remove", "Remove this resource folder entry", "LA_remove_resource_folder", U'🞫', 0);
  1648. }
  1649. p = laAddPropertyContainer("managed_udf", "Managed UDF", "Managed UDF files", U'🖹', laui_ManagedUDFItem, sizeof(laManagedUDF), 0,0,0);{
  1650. laAddStringProperty(p, "basename", "Base Name", "Base name of the file (withiout directory)", 0,0,0,0,1, offsetof(laManagedUDF, BaseName), 0,0,0,0,LA_AS_IDENTIFIER|LA_READ_ONLY);
  1651. laAddSubGroup(p, "udf", "UDF", "Reference to target UDF file", "udf",0,0,0,offsetof(laManagedUDF, udf), 0,0,0,0,0,0,0,LA_UDF_REFER);
  1652. }
  1653. p = laAddPropertyContainer("udf", "UDF File", "UDF file block", U'🖹', 0,sizeof(laUDF), 0,0,0);{
  1654. laAddStringProperty(p, "path", "Path", "File path", 0,0,0,0,1, offsetof(laUDF, FileName), 0,0,0,0,LA_READ_ONLY);
  1655. ep=laAddEnumProperty(p, "modified", "Modified", "File modified", LA_WIDGET_ENUM_ICON_PLAIN,0,0,0,0,offsetof(laUDF, Modified),0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
  1656. laAddEnumItemAs(ep, "MODIFIED", "Modified", "There are unsaved changes bound to this file", 1, U'🌑');
  1657. laAddEnumItemAs(ep, "CLEAN", "Clean", "File data is untouched", 0,0);
  1658. ep->ElementBytes=2;
  1659. }
  1660. p = laAddPropertyContainer("managed_prop", "Managed Property", "Managed property for detecting changes for saving files", 0,0,sizeof(laManagedSaveProp), 0,0,0);{
  1661. laAddStringProperty(p, "path", "Path", "Property path", 0,0,0,0,1, offsetof(laManagedSaveProp, Path), 0,0,0,0,LA_READ_ONLY);
  1662. }
  1663. p = laAddPropertyContainer("int_property", "Int Property", "Int property specific info", U'i', laui_IntPropInfo, sizeof(laIntProp), 0,0,1);{
  1664. laAddIntProperty(p, "range", "Range", "Range of the property", 0,"Min,Max", 0,0,0,0,0,0,offsetof(laIntProp, Min), 0,0,2, 0,0,0,0,0,0,0,LA_READ_ONLY);
  1665. laAddIntProperty(p, "default", "Default", "Default value", 0,0,0,0,0,0,0,0,offsetof(laIntProp, DefVal), 0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
  1666. laAddIntProperty(p, "step", "Step", "Ui step of the value", 0,0,0,0,0,0,0,0,offsetof(laIntProp, Step), 0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
  1667. laAddSubGroup(p, "base", "Base", "Property Base", "property_item", 0,0,0,0,0,0,0,0,0,0,0,LA_UDF_SINGLE|LA_UDF_LOCAL);
  1668. } MAIN.ContainerInt = p;
  1669. p = laAddPropertyContainer("float_property", "Float Property", "Float property specific info", U'i', laui_FloatPropInfo, sizeof(laFloatProp), 0,0,1);{
  1670. laAddFloatProperty(p, "range", "Range", "Range of the property", 0,"Min,Max", 0,0,0,0,0,0,offsetof(laFloatProp, Min), 0,0,2, 0,0,0,0,0,0,0,LA_READ_ONLY);
  1671. laAddFloatProperty(p, "default", "Default", "Default value", 0,0,0,0,0,0,0,0,offsetof(laFloatProp, DefVal), 0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
  1672. laAddFloatProperty(p, "step", "Step", "Ui step of the value", 0,0,0,0,0,0,0,0,offsetof(laFloatProp, Step), 0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
  1673. laAddSubGroup(p, "base","Base", "Property Base", "property_item", 0,0,0,0,0,0,0,0,0,0,0,LA_UDF_SINGLE|LA_UDF_LOCAL);
  1674. } MAIN.ContainerFloat = p;
  1675. // USER PREF ========================================================
  1676. p = laAddPropertyContainer("la_user_preference", "User Preference", "Kernel settings for la main structure", U'⚙', 0,sizeof(LA), lapost_UserPreferences, 0,2|LA_PROP_OTHER_ALLOC);{
  1677. laPropContainerExtraFunctions(p,0,lareset_Main,0,0,0);
  1678. laAddFloatProperty(p, "idle_time", "Idle time", "Time out on no input to show tooltips", 0,0,0,2.0,0.3, 0.05, 0.75, 0,offsetof(LA, IdleTime), 0,0,0,0,0,0,0,0,0,0,0);
  1679. laAddIntProperty(p, "top_framerate", "Top Framerate", "Framerate limiter for drawing the user interface", 0,0,0,60,25, 1, 60,0,offsetof(LA, TopFramerate), 0,0,0,0,0,0,0,0,0,0,0);
  1680. laAddIntProperty(p, "valuator_threshold", "Valuator Threshold", "Drag how many pixels trigger a change in valuator", 0,0,0,10,1, 1, 3, 0,offsetof(LA, ValuatorThreshold), 0,0,0,0,0,0,0,0,0,0,0);
  1681. laAddIntProperty(p, "scroll_speed", "Scrolling Speed", "How many rows to move when scrolling using mouse wheel", 0,0,0,10,1, 1, 3, 0,offsetof(LA, ScrollingSpeed), 0,0,0,0,0,0,0,0,0,0,0);
  1682. laAddFloatProperty(p, "animation_speed", "Animation Speed", "Ui animation speed", 0,0,0,0.6, 0.1, 0.05, 0.2, 0,offsetof(LA, AnimationSpeed), 0,0,0,0,0,0,0,0,0,0,0);
  1683. laAddFloatProperty(p, "panel_animation_speed", "Panel Animation Speed", "Panel animation speed", 0,0,0,0.6, 0.1, 0.05, 0.2, 0,offsetof(LA, PanelAnimationSpeed), 0,0,0,0,0,0,0,0,0,0,0);
  1684. laAddFloatProperty(p, "zoom_speed_2d", "Zoom Speed 2D", "2d canvas zooming speed", 0,0,0,0.5, 0.01, 0.01, 0.01, 0,offsetof(LA, ZoomSpeed2D), 0,0,0,0,0,0,0,0,0,0,0);
  1685. laAddIntProperty(p, "tooltip_close_distance", "Tooltip Close Distance", "The tooltip will hide if mouse moved away further", 0,0,0,100,0,1, 40,0,offsetof(LA, TooltipCloseDistance), 0,0,0,0,0,0,0,0,0,0,0);
  1686. ep = laAddEnumProperty(p, "panel_multisample", "Panel Multisample", "Multisample mode for drawing panels", 0,0,0,0,0,offsetof(LA, PanelMultisample), 0,laset_PanelMultisample, 0,0,0,0,0,0,0,0);{
  1687. laAddEnumItemAs(ep, "none", "None", "Don't use multisample", 0,0);
  1688. laAddEnumItemAs(ep, "2", "2X", "2X multisample", 2, 0);
  1689. laAddEnumItemAs(ep, "4", "4X", "4X multisample", 4, 0);
  1690. laAddEnumItemAs(ep, "8", "8X", "8X multisample", 8, 0);
  1691. laAddEnumItemAs(ep, "16", "16X", "16X multisample", 16, 0);
  1692. }
  1693. ep=laAddEnumProperty(p, "enable_gl_debug", "Enable OpenGL Debug", "Enable OpenGL debug output in the system terminal", LA_WIDGET_ENUM_HIGHLIGHT,0,0,0,0,offsetof(LA, EnableGLDebug),0,laset_EnableGLDebug,0,0,0,0,0,0,0,0);
  1694. laAddEnumItemAs(ep, "DISABLED", "Disabled", "OpenGL debug output is disabled", 0, 0);
  1695. laAddEnumItemAs(ep, "ENABLED", "Enabled", "Will print OpenGL debug information to the system terminal", 1, 0);
  1696. ep=laAddEnumProperty(p, "gl_debug_sync", "Debug Sync", "Whether OpenGL debug output should be in sync with the caller", LA_WIDGET_ENUM_HIGHLIGHT,0,0,0,0,offsetof(LA, GLDebugSync),0,laset_GLDebugSync,0,0,0,0,0,0,0,0);
  1697. laAddEnumItemAs(ep, "DISABLED", "Disabled", "OpenGL debug output will be printing freely", 0, 0);
  1698. laAddEnumItemAs(ep, "ENABLED", "Enabled", "OpenGL debug output will hold the gl-call until return", 1, 0);
  1699. ep=laAddEnumProperty(p, "gl_debug_level", "Debug Level", "OpenGL debug message level", 0,"Note,Low,Med,High",0,0,0,offsetof(LA, GLDebugLevel),0,laset_GLDebugLevel,0,0,0,0,0,0,0,0);
  1700. laAddEnumItemAs(ep, "ALL", "ALL", "Show all debug messages", 0, 0);
  1701. laAddEnumItemAs(ep, "NOTE", "Note", "Show notifications", 1, 0);
  1702. laAddEnumItemAs(ep, "LOW", "Low", "Show low severity messages", 2, 0);
  1703. laAddEnumItemAs(ep, "MEDIUM", "Medium", "Show low severity messages", 3, 0);
  1704. laAddEnumItemAs(ep, "HIGH", "High", "Show high severity messages", 4, 0);
  1705. ep=laAddEnumProperty(p, "enable_log_stdout", "Enable Log StdOut", "Enable log printing to stdout", LA_WIDGET_ENUM_HIGHLIGHT,0,0,0,0,offsetof(LA, EnableLogStdOut),0,0,0,0,0,0,0,0,0,0);
  1706. laAddEnumItemAs(ep, "DISABLED", "Disabled", "StdOut log only outputs necessary stuff", 0, 0);
  1707. laAddEnumItemAs(ep, "ENABLED", "Enabled", "Will print all logs to stdout", 1, 0);
  1708. ep = laAddEnumProperty(p, "enable_performance_overlay", "Performance Overlay", "Show performance overlay for development purposes", LA_WIDGET_ENUM_HIGHLIGHT,0,0,0,0,offsetof(LA, ShowPerf),0,0,0,0,0,0,0,0,0,0);{
  1709. laAddEnumItemAs(ep, "NONE", "None", "Don't show overlay", 0,0);
  1710. laAddEnumItemAs(ep, "PERF", "Perf", "Show performance overlay", 1,0);
  1711. }
  1712. ep=laAddEnumProperty(p, "enable_color_management", "Enable Color Management", "Whether to enable color management or not", LA_WIDGET_ENUM_HIGHLIGHT,0,0,0,0,offsetof(LA, EnableColorManagement),0,0,0,0,0,0,0,0,0,0);
  1713. laAddEnumItemAs(ep, "NONE", "None", "Do not do color management on the window", 0, 0);
  1714. laAddEnumItemAs(ep, "ENABLED", "Enabled", "Enable color management on the window", 1, 0);
  1715. laAddFloatProperty(p, "margin_size", "Margin Size", "The global margin factor", 0,0,0,2.0f, 0.1f, 0.02, 1.0f, 0,offsetof(LA, MarginSize), 0,laset_MarginSize, 0,0,0,0,0,0,0,0,0);
  1716. laAddFloatProperty(p, "font_size", "Font Size", "The height of the font related to the row height", 0,0,0,1.0f, 0.1f, 0.02, 0.75, 0,offsetof(LA, FontSize), 0,laset_FontSize, 0,0,0,0,0,0,0,0,0);
  1717. laAddIntProperty(p, "interface_size", "Interface Size", "The height of one row of ui item", 0,0,0,64, 16, 1, 40,0,offsetof(LA, UiRowHeight), 0,laset_UiRowHeight, 0,0,0,0,0,0,0,0,0);
  1718. laAddIntProperty(p, "wire_color_slices", "Wire color slices", "How many slices of color to give to node sockets", 0,0,0,32, 1, 1, 16, 0,offsetof(LA, WireColorSlices), 0,laset_WireColorSlices, 0,0,0,0,0,0,0,0,0);
  1719. laAddFloatProperty(p, "wire_thickness", "Wire thickness", "How thick is a wire", 0,0,0,10,0.1, 0.5, 5, 0,offsetof(LA, WireThickness), 0,laset_WireThickness, 0,0,0,0,0,0,0,0,0);
  1720. laAddFloatProperty(p, "wire_saggyness", "Wire saggyness", "How saggy is a wire", 0,0,0,1,0,0.01, 0.5, 0,offsetof(LA, WireSaggyness), 0,laset_WireSaggyness, 0,0,0,0,0,0,0,0,0);
  1721. ep = laAddEnumProperty(p, "enable_translation", "Enable Translation", "Translate user interface into another language", 0,0,0,1, 0,offsetof(LA, Translation.EnableTranslation), 0,transState, 0,0,0,0,0,0,0,0);{
  1722. laAddEnumItem(ep, "no", "No", "Use original english string", 0);
  1723. laAddEnumItem(ep, "yes", "Yes", "Use translated string", 0);
  1724. }
  1725. laAddSubGroup(p, "languages", "Language", "The language list in the software", "la_translation_language",0,0,laui_IdentifierOnly, offsetof(LA, Translation.CurrentLanguage), 0,0,0,laset_Language,0,0,offsetof(LA, Translation.Languages),LA_UDF_IGNORE);
  1726. laAddSubGroup(p, "resource_folders", "Resource Folders", "Folders to search for resources", "la_resource_folder",0,0,0,-1, 0,0,0,0,0,0,offsetof(LA, ResourceFolders), 0);
  1727. ep = laAddEnumProperty(p, "manager_default_view", "UDF Manager Default View", "Prefer to show data blocks or files when saving", 0,0,0,0,0,offsetof(LA, ManagerDefaultView), 0,0,0,0,0,0,0,0,0,0);{
  1728. laAddEnumItemAs(ep, "DATA_BLOCKS", "Data Blocks", "All data blocks", 0,0);
  1729. laAddEnumItemAs(ep, "FILES", "Files", "All Files", 1, 0);
  1730. }
  1731. ep = laAddEnumProperty(p, "manager_filter_instances", "Filter Instances", "Whether to show only unsaved stuff or everything", 0,0,0,0,0,offsetof(LA, ManagerFilterInstances), 0,laset_ManagerFilterInstances,0,0,0,0,0,0,0,0);{
  1732. laAddEnumItemAs(ep, "ALL", "All", "All Instances", 0,0);
  1733. laAddEnumItemAs(ep, "Modified", "Modified", "Modified and unsigned instances", 1, 0);
  1734. }
  1735. ep = laAddEnumProperty(p, "save_preferences_on_exit", "Save On Exit", "Save user preferences before exiting the program", 0,0,0,0,0,offsetof(LA, SavePreferenceOnExit), 0,0,0,0,0,0,0,0,0,0);{
  1736. laAddEnumItemAs(ep, "NONE", "Don't save", "Not saving user preferences on exit", 0,0);
  1737. laAddEnumItemAs(ep, "SAVE", "Save", "Saving user preferences on exit", 1, U'✓');
  1738. }
  1739. laAddIntProperty(p, "wacom_device_stylus", "Stylus Device", "Wacom stylus device ID", LA_WIDGET_INT_PLAIN, 0,0,0,0,0,0,0,offsetof(LA, WacomDeviceStylus), 0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY|LA_UDF_IGNORE);
  1740. laAddIntProperty(p, "wacom_device_eraser", "Eraser Device", "Wacom eraser device ID", LA_WIDGET_INT_PLAIN, 0,0,0,0,0,0,0,offsetof(LA, WacomDeviceEraser), 0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY|LA_UDF_IGNORE);
  1741. ep = laAddEnumProperty(p, "wacom_driver", "Wacom driver", "Wacom driver to read pressure info from on Windows", 0, 0, 0, 0, 0, offsetof(LA, InkOrWinTab), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); {
  1742. laAddEnumItemAs(ep, "WINDOWS_INK", "Windows Ink", "Use Windows Ink pressure events (WM_POINTERUPDATE).", 0, 0);
  1743. laAddEnumItemAs(ep, "WINTAB", "WinTab", "Use wacom WinTab driver to read pressure events (WT_PACKET).", 1, 0);
  1744. }
  1745. laAddFloatProperty(p, "color_picker_gamma", "Color Picker Gamma", "Allows less saturated colors to have more areas", 0,0,0,3.0,1.0, 0.05,1.5, 0,offsetof(LA, ColorPickerGamma), 0,laset_ColorPickerGamma,0,0,0,0,0,0,0,0,0);
  1746. laAddFloatProperty(p, "viewport_halftone_factor", "Halftone Factor", "Viewport halftone mixing factor", 0,0,0,1.0,0.0,0.05,0.5, 0,offsetof(LA, ViewportHalftoneFactor), 0,laset_ViewportHalftoneFactor,0,0,0,0,0,0,0,0,0);
  1747. laAddFloatProperty(p, "viewport_halftone_size", "Halftone Size", "Viewport halftone size", 0,0,0,8.0,1.9, 0.05,3.7, 0,offsetof(LA, ViewportHalftoneSize), 0,laset_ViewportHalftoneSize,0,0,0,0,0,0,0,0,0);
  1748. laAddStringProperty(p,"theme_name","Theme Name","Using theme name",0,0,0,0,0,0,0,laget_UsingTheme,0,laread_UsingTheme,0);
  1749. laAddSubGroup(p,"screens","Screens","Screens connected to this computer","la_screen",0,0,0,-1,0,0,0,0,0,0,offsetof(LA,Screens),0);
  1750. ep = laAddEnumProperty(p, "auto_switch_color_space", "Auto Switch Color Space", "Automatically switch color space for windows on different screens",LA_WIDGET_ENUM_HIGHLIGHT, 0, 0, 0, 0, offsetof(LA, AutoSwitchColorSpace), 0, laset_AutoSwitchColorSpace, 0, 0, 0, 0, 0, 0, 0, 0); {
  1751. laAddEnumItemAs(ep, "NONE", "None", "Windows keep their own color space", 0, 0);
  1752. laAddEnumItemAs(ep, "ENABLED", "Enabled", "Automatically switch window's color space based on settings here", 1, 0);
  1753. }
  1754. }
  1755. p = laAddPropertyContainer("la_input_mapping_bundle", "Input Mapping Bundle", "Bundle of input mapping data", 0,0,sizeof(laInputMappingBundle), 0,0,1);{
  1756. laAddSubGroup(p, "mappings","Mappings","Input mappings","la_input_mapping",0,0,0,-1,0,laget_CurrentInputMapping,0,0,0,0,offsetof(laInputMappingBundle,InputMappings),0);
  1757. laAddSubGroup(p, "current","Current Mapping","Current input mapping","la_input_mapping",0,0,0,offsetof(laInputMappingBundle,CurrentInputMapping),laget_FirstInputMapping,0,laget_ListNext,0,0,0,0,LA_UDF_REFER);
  1758. laAddSubGroup(p, "toolboxes","Toolboxes","Custom toolboxes","la_toolbox",0,0,0,-1,0,laget_CurrentInputMapping,0,0,0,0,offsetof(laInputMappingBundle,Toolboxes),0);
  1759. sp=laAddSubGroup(p, "current_toolbox","Current Toolbox","Current tool box","la_toolbox",0,0,0,offsetof(laInputMappingBundle,CurrentToolbox),laget_FirstToolbox,0,laget_ListNext,0,0,0,0,LA_UDF_REFER);
  1760. laSubGroupDetachable(sp, laget_detached_FirstToolbox, laget_ListNext);
  1761. ep=laAddEnumProperty(p,"toolbox_layout","Toolbox Layout","Toolbox layout",0,0,0,0,0,offsetof(laInputMappingBundle,ToolboxLayout),0,0,0,0,0,0,0,0,0,0);
  1762. laAddEnumItemAs(ep, "LIST", "#", "Display as list", 0, 0);
  1763. laAddEnumItemAs(ep, "W3", "W3", "Width of 3", 3, 0);
  1764. laAddEnumItemAs(ep, "W5", "W5", "Width of 5", 5, 0);
  1765. laAddEnumItemAs(ep, "W8", "W8", "Width of 8", 8, 0);
  1766. laAddEnumItemAs(ep, "W13", "W13", "Width of 13", 13, 0);
  1767. }
  1768. p = laAddPropertyContainer("la_input_mapping", "Input Mapping", "Input mapping data", 0,0,sizeof(laInputMapping), 0,0,2);{
  1769. laAddStringProperty(p, "name", "Name", "The name of this mapping", 0,0,0,"Mapping", 1, offsetof(laInputMapping, Name), 0,0,0,0,LA_AS_IDENTIFIER);
  1770. laAddSubGroup(p, "entries","Entries","Input mapping entries","la_input_mapping_entry",0,0,0,-1,0,0,0,0,0,0,offsetof(laInputMapping,Entries),0);
  1771. laAddOperatorProperty(p,"remove","Remove","Remove this mapping","LA_remove_input_mapping",U'🞫',0);
  1772. laAddOperatorProperty(p,"new_entry","New Entry","New mapping entry","LA_new_input_mapping_entry",'+',0);
  1773. }
  1774. p = laAddPropertyContainer("la_toolbox", "Toolbox", "Toolbox data", 0,0,sizeof(laInputMapping), 0,0,2);{
  1775. laAddStringProperty(p, "name", "Name", "The name of this toolbox", 0,0,0,"Toolbox", 1, offsetof(laInputMapping, Name), 0,0,0,0,LA_AS_IDENTIFIER);
  1776. laAddSubGroup(p, "entries","Entries","Toolbox entries","la_input_mapping_entry",0,0,0,-1,0,0,0,0,0,0,offsetof(laInputMapping,Entries),0);
  1777. laAddOperatorProperty(p,"remove","Remove","Remove this mapping","LA_remove_toolbox",U'🞫',0);
  1778. laAddOperatorProperty(p,"new_entry","New Entry","New toolbox entry","LA_new_input_mapping_entry",'+',0);
  1779. }
  1780. p = laAddPropertyContainer("la_input_mapping_entry", "Input Mapping Entry", "Input mapping entry", 0,0,sizeof(laInputMappingEntry), 0,0,1);{
  1781. laAddIntProperty(p,"__move","Move Slider","Move Slider",LA_WIDGET_HEIGHT_ADJUSTER,0,0,0,0,0,0,0,0,0,laset_InputMappingEntryMove,0,0,0,0,0,0,0,0,LA_UDF_IGNORE);
  1782. ep=laAddEnumProperty(p,"disabled","Enabled","Enable or disable this input mapping entry",0,0,0,0,0,offsetof(laInputMappingEntry,Disabled),0,0,0,0,0,0,0,0,0,0);
  1783. laAddEnumItemAs(ep, "ENABLED", "Enabled", "Entry enabled", 0, U'✓');
  1784. laAddEnumItemAs(ep, "DISABLED", "Disabled", "Entry disabled", 1, U'✗');
  1785. ep=laAddEnumProperty(p,"device_type","Device Type","Device type of the input event",0,0,0,0,0,offsetof(laInputMappingEntry,DeviceType),0,0,0,0,0,0,0,0,0,0);
  1786. laAddEnumItemAs(ep, "KEYBOARD", "Keyboard", "Keyboard input", LA_INPUT_DEVICE_KEYBOARD, U'🖮');
  1787. laAddEnumItemAs(ep, "MOUSE", "Mouse", "Mouse input", LA_INPUT_DEVICE_MOUSE, U'🖱');
  1788. laAddEnumItemAs(ep, "JOYSTICK", "Joystick", "Joystick input", LA_INPUT_DEVICE_JOYSTICK, U'🕹');
  1789. laAddIntProperty(p,"joystick_device","Joystick Device","Joystick device number",0,0,0,0,0,0,0,0,offsetof(laInputMappingEntry,JoystickDevice),0,0,0,0,0,0,0,0,0,0,0);
  1790. laAddStringProperty(p,"key","Key","Event key",0,0,0,0,1,offsetof(laInputMappingEntry,Key),0,0,laset_InputMappingEntryKeyString,0,0);
  1791. laAddStringProperty(p,"signal","Signal","Target signal",0,0,0,0,1,offsetof(laInputMappingEntry,Signal),0,0,laset_InputMappingEntrySignalString,0,0);
  1792. laAddSubGroup(p,"signal_selection","Signal","Signal selection","la_custom_signal",0,0,laui_IdentifierOnly,-1,laget_FirstCustomSignal,0,laget_ListNext,laset_InputMappingEntrySignal,0,0,0,LA_UDF_IGNORE);
  1793. laAddOperatorProperty(p,"remove","Remove","Remove this entry","LA_remove_input_mapping_entry",U'🞫',0);
  1794. laAddOperatorProperty(p,"select_signal","Select","Select signal","LA_input_mapping_entry_select_signal",0,0);
  1795. laAddOperatorProperty(p,"select_operator","Select","Select operator","LA_input_mapping_entry_select_operator",0,0);
  1796. laAddOperatorProperty(p,"select_key","Select Key","Select key","LA_input_mapping_entry_select_key",0,0);
  1797. laAddOperatorProperty(p,"reset","Reset","Reset entry","LA_reset_input_mapping_fields",0,0);
  1798. laAddSubGroup(p,"parent","Parent","Parent group","la_input_mapping",0,0,0,offsetof(laInputMappingEntry,Parent),0,0,0,0,0,0,0,LA_UDF_REFER);
  1799. ep=laAddEnumProperty(p,"use_operator","Device Type","Device type of the input event",0,0,0,0,0,offsetof(laInputMappingEntry,UseOperator),0,0,0,0,0,0,0,0,0,0);
  1800. laAddEnumItemAs(ep, "SIGNAL", "Signal", "Send signal upon input", 0, U'⚟');
  1801. laAddEnumItemAs(ep, "OPERATOR", "Operator", "Run operator upon input", 1, U'🏃');
  1802. laAddStringProperty(p,"operator","Operator","Operator to call",0,0,0,0,1,offsetof(laInputMappingEntry,Operator),0,0,laset_InputMappingEntryOperatorString,0,0);
  1803. laAddStringProperty(p,"operator_name","Operator Name","Target operator name",0,0,0,0,1,offsetof(laInputMappingEntry,OperatorName),0,0,0,0,LA_READ_ONLY);
  1804. laAddStringProperty(p,"operator_arguments","Arguments","Extra arguments for the operator",0,0,0,0,1,offsetof(laInputMappingEntry,OperatorArguments),0,0,0,0,0);
  1805. ep=laAddEnumProperty(p,"operator_base","Operator Base","Operator parent context base",0,0,0,0,0,offsetof(laInputMappingEntry,OperatorBase),0,0,0,0,0,0,0,0,0,0);
  1806. laAddEnumItemAs(ep, "NONE", "None", "Run operator directly", 0, 0);
  1807. laAddEnumItemAs(ep, "WIDGET", "Widget", "Run operator with extra reference of current UI", LA_KM_SEL_UI_EXTRA, 0);
  1808. laAddEnumItemAs(ep, "PANEL", "Panel", "Run operator with extra reference of current panel", LA_KM_SEL_PANEL, 0);
  1809. laAddOperatorProperty(p,"run_entry","Run Entry","Run this entry","LA_run_toolbox_entry",0,0);
  1810. }
  1811. p = laAddPropertyContainer("la_custom_signal", "Custom Signal", "Custom signal", 0,0,sizeof(laCustomSignal), 0,0,1);{
  1812. laAddStringProperty(p, "name", "Name", "The name of this mapping", 0,0,0,"Mapping", 1, offsetof(laCustomSignal, Name), 0,0,0,0,LA_AS_IDENTIFIER);
  1813. }
  1814. p = laAddPropertyContainer("la_operator_type", "Operator Type", "Operator type", 0,laui_OperatorTypeEntry,sizeof(laOperatorType), 0,0,1);{
  1815. laAddStringProperty(p, "identifier", "Identifier", "The identifier of the operator", 0,0,0, "none", 0, offsetof(laOperatorType, Identifier), 0,0,0,0,LA_AS_IDENTIFIER|LA_READ_ONLY);
  1816. laAddStringProperty(p, "name", "Name", "The name of operator", 0,0,0, "none", 0, offsetof(laOperatorType, Name), 0,0,0,0,LA_READ_ONLY);
  1817. laAddStringProperty(p, "description", "Description", "Description of the operator", 0,0,0, "none", 0, offsetof(laOperatorType, Description), 0,0,0,0,LA_READ_ONLY);
  1818. }
  1819. p = laAddPropertyContainer("la_translation_language", "Language", "Translation language pack", 0,0,sizeof(laTranslationNode), 0,0,1);{
  1820. laAddStringProperty(p, "name", "Name", "The name of this language", 0,0,0,"Unknown", 1, offsetof(laTranslationNode, LanguageName), 0,0,0,0,LA_AS_IDENTIFIER);
  1821. }
  1822. p = laAddPropertyContainer("la_extension_type", "Extension Type", "File extension and its matching type for file filtering", 0,0,sizeof(laExtensionType), 0,0,0);{
  1823. laAddStringProperty(p, "extension", "Extension", "File extension string", LA_WIDGET_STRING_PLAIN, 0,0,0,0,offsetof(laExtensionType, Extension), 0,0,0,0,LA_AS_IDENTIFIER|LA_READ_ONLY);
  1824. }
  1825. // UI WINDOW ========================================================================================
  1826. p = laAddPropertyContainer("ui_window", "SYSWINDOW Node", "Property container for a system syswindow", 0,0, sizeof(laWindow), lapost_Window, lapostim_Window,1);{
  1827. laAddStringProperty(p, "title", "Title", "The title/name of a panel", 0,0,0,0,1, offsetof(laWindow, Title), 0,0,0,0,LA_AS_IDENTIFIER);
  1828. laAddSubGroup(p, "layouts", "Layouts", "Layout List Of The Whole SYSWINDOW", "ui_layout",0,0,0,offsetof(laWindow, CurrentLayout), laget_WindowFirstLayout, laget_WindowActiveLayout,laget_ListNext, 0,0,laset_WindowActiveLayout, offsetof(laWindow, Layouts), 0);
  1829. _LA_PROP_PANEL = laAddSubGroup(p, "panels", "Panels", "Panel list of this window", "ui_panel",0,0,0,-1,laget_SavePanel,0,lagetnext_SavePanel,0,0,0,offsetof(laWindow, Panels), 0);
  1830. la_UDFAppendSharedTypePointer("_LA_PROP_PANEL", _LA_PROP_PANEL);
  1831. laAddSubGroup(p, "maximized_block", "Maximized Block", "Maximized block in this window", "ui_block",0,0,0,offsetof(laWindow, MaximizedBlock), 0,0,0,0,0,0,0,LA_UDF_REFER|LA_UDF_IGNORE);
  1832. laAddSubGroup(p, "maximized_ui", "Maximized Ui", "Maximized ui in this window", "ui_item",0,0,0,offsetof(laWindow, MaximizedUi), 0,0,0,0,0,0,0,LA_UDF_REFER|LA_UDF_IGNORE);
  1833. laAddSubGroup(p, "panels_hidden", "Hidden Panels", "Hidden panels of this window", "ui_panel",0,0,0,-1, laget_FirstHiddenPanel, 0,laget_NextHiddenPanel, laset_WindowHiddenPanel, 0,0,0,LA_UDF_IGNORE);
  1834. laAddIntProperty(p, "position", "Position", "The Position Of A SYSWINDOW", 0,"X,Y", "px", 0,0,1, 0,0,offsetof(laWindow, X), 0,0,2, 0,0,0,0,0,0,0,0);
  1835. laAddIntProperty(p, "size", "Size", "The Size Of A SYSWINDOW", 0,"W,H", "px", 0,0,0,0,0,offsetof(laWindow, W), 0,0,2, 0,0,0,0,0,0,0,LA_READ_ONLY);
  1836. laAddIntProperty(p, "client_size", "Client Area Size", "Display Canvans Size Of A SYSWINDOW", 0,"W,H", "px", 0,0,1, 0,0,offsetof(laWindow, CW), 0,0,2, 0,0,0,0,0,0,0,LA_READ_ONLY);
  1837. laAddStringProperty(p, "operator_hints", "Operator Hints", "Operator hints if there's any", LA_WIDGET_STRING_PLAIN, 0,0,0,1, offsetof(laWindow, OperatorHints), 0,0,0,0,LA_READ_ONLY|LA_UDF_IGNORE);
  1838. ep = laAddEnumProperty(p, "output_color_space", "Output Color Space", "Output color space of this window, set this to the monitor's color space to get accurate result", 0,0,0,0,0,offsetof(laWindow, OutputColorSpace), 0,laset_WindowColorSpace, 0,0,0,0,0,0,0,0);{
  1839. laAddEnumItemAs(ep, "SRGB", "sRGB", "Standard sRGB diplay", TNS_COLOR_SPACE_SRGB, 0);
  1840. laAddEnumItemAs(ep, "CLAY", "Clay", "Clay color space (AdobeRGB 1998 compatible)", TNS_COLOR_SPACE_CLAY, 0);
  1841. laAddEnumItemAs(ep, "D65_P3", "D65 P3", "D65 P3 color space", TNS_COLOR_SPACE_D65_P3, 0);
  1842. }
  1843. ep = laAddEnumProperty(p, "output_proofing", "Proofing", "Show soft proofing in this window", 0,0,0,0,0,offsetof(laWindow, OutputProofing), 0,laset_WindowOutputProofing, 0,0,0,0,0,0,0,0);{
  1844. laAddEnumItemAs(ep, "NONE", "None", "Not doing soft proofing", 0, U'🖵');
  1845. laAddEnumItemAs(ep, "PROOFING", "Proofing", "Show soft proofing", 1, U'🖶');
  1846. }
  1847. ep = laAddEnumProperty(p, "output_show_overflow", "Show Overflow", "Show stripes on overflowing colors", LA_WIDGET_ENUM_HIGHLIGHT, 0,0,0,0,offsetof(laWindow, OutputShowStripes), 0,laset_WindowShowStripes, 0,0,0,0,0,0,0,0);{
  1848. laAddEnumItemAs(ep, "NONE", "None", "Don't show overflow", 0,0);
  1849. laAddEnumItemAs(ep, "STRIPES", "Stripes", "Show overflowing colors as stripes", 1, 0);
  1850. }
  1851. ep = laAddEnumProperty(p, "use_composing", "Use Composing", "Compose and adjust window colors, best for outdoor lighting", LA_WIDGET_ENUM_HIGHLIGHT,0,0,0,0,offsetof(laWindow, UseComposing), 0,laset_WindowUseComposing, 0,0,0,0,0,0,0,0);{
  1852. laAddEnumItemAs(ep, "NONE", "None", "Do not use composing", 0, 0);
  1853. laAddEnumItemAs(ep, "SUN", "Sun", "Compose with outdoor sunlight options", 1, 0);
  1854. }
  1855. laAddFloatProperty(p, "composing_gamma", "Composing Gamma", "Composing gamma", 0,0,0,2,0.25,0.05,1.0,0,offsetof(laWindow, ComposingGamma), 0,laset_WindowComposingGamma,0,0,0,0,0,0,0,0,0);
  1856. laAddFloatProperty(p, "composing_blackpoint", "Composing Blackpoint", "Composing blackpoint", 0,0,0,0.5,0,0.05,0.0,0,offsetof(laWindow, ComposingBlackpoint), 0,laset_WindowComposingBlackpoint,0,0,0,0,0,0,0,0,0);
  1857. laAddIntProperty(p, "is_fullscreen", "Is Fullscreen", "Is the window fullscreen", 0,0,0,0,0,0,0,0,offsetof(laWindow, IsFullScreen),0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
  1858. }
  1859. p = laAddPropertyContainer("la_screen","Screen","Screen detected from system",0,0,sizeof(laScreen),0,0,1);{
  1860. laAddStringProperty(p,"name","Name","Name of the screen",LA_WIDGET_STRING_PLAIN,0,0,0,1,offsetof(laScreen,Name),0,0,0,0,LA_READ_ONLY|LA_AS_IDENTIFIER);
  1861. laAddStringProperty(p,"description","Description","Desctiption of this screen",LA_WIDGET_STRING_MONO_PLAIN,0,0,0,1,offsetof(laScreen,Description),0,0,0,0,LA_READ_ONLY);
  1862. ep = laAddEnumProperty(p, "color_space", "Output Color Space", "Hardware color space of this screen ", 0,0,0,0,0,offsetof(laScreen,ColorSpace), 0,laset_ScreenColorSpace, 0,0,0,0,0,0,0,0);{
  1863. laAddEnumItemAs(ep, "SRGB", "sRGB", "Standard sRGB diplay", TNS_COLOR_SPACE_SRGB, 0);
  1864. laAddEnumItemAs(ep, "CLAY", "Clay", "Clay color space (AdobeRGB 1998 compatible)", TNS_COLOR_SPACE_CLAY, 0);
  1865. laAddEnumItemAs(ep, "D65_P3", "D65 P3", "D65 P3 color space", TNS_COLOR_SPACE_D65_P3, 0);
  1866. }
  1867. laAddOperatorProperty(p,"remove","Remove","Remove this screen config","LA_remove_screen_config",0,0);
  1868. }
  1869. // UI LAYOUT ========================================================================================
  1870. p = laAddPropertyContainer("ui_block", "Ui Block", "Property container for single ui block", 0,0, sizeof(laBlock), lapost_Block,0,1);{
  1871. laAddIntProperty(p, "location", "Location", "Block Location", 0,"X,Y", "px", 0,0,1, 0,0,offsetof(laBlock, X), 0,0,2, 0,0,0,0,0,0,0,LA_READ_ONLY);
  1872. laAddIntProperty(p, "size", "Size", "Block Size", 0,"W,H", "px", 0,0,1, 0,0,offsetof(laBlock, W), 0,0,2, 0,0,0,0,0,0,0,LA_READ_ONLY);
  1873. laAddFloatProperty(p, "split_ratio", "Split Ratio", "Split ratio on two subs", 0,0,0,1, 0,0.05, 0.5, 0,offsetof(laBlock, SplitRatio), 0,0,0,0,0,0,0,0,0,0,0);
  1874. laAddIntProperty(p, "vertical", "Vertical", "Is vertival or not", 0,0,0,1, 0,1, 0,0,offsetof(laBlock, Vertical), 0,0,0,0,0,0,0,0,0,0,0);
  1875. laAddIntProperty(p, "folded", "Folded", "Block is folded",0,0,0,1,0,0,0,0,offsetof(laBlock, Folded),0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
  1876. laAddSubGroup(p, "panel_list", "Panel List", "Panels Under This Block", "ui_panel",0,0,0,-1, 0,0,0,0,0,0,offsetof(laBlock, Panels), 0);
  1877. laAddSubGroup(p, "current_panel", "Current Panel", "Current Selected Tab Panel", "ui_panel",0,0,0,offsetof(laBlock, CurrentPanel), 0,0,0,0,0,0,0,LA_UDF_REFER);
  1878. laAddSubGroup(p, "sub1", "Sub 1", "Sub Block 1", "ui_block",0,0,0,offsetof(laBlock, B1), 0,0,0,0,0,0,0,LA_UDF_SINGLE);
  1879. laAddSubGroup(p, "sub2", "Sub 2", "Sub Block 2", "ui_block",0,0,0,offsetof(laBlock, B2), 0,0,0,0,0,0,0,LA_UDF_SINGLE);
  1880. laAddSubGroup(p, "parent", "Parent", "Parent block reference", "ui_block",0,0,0,offsetof(laBlock, parent), 0,0,0,0,0,0,0,LA_UDF_REFER);
  1881. laAddOperatorProperty(p, "fold", "Fold", "Fold the title bar", "LA_block_fold_title", 0,0);
  1882. laAddOperatorProperty(p, "maximize", "Maximize", "Maximize the block", "LA_block_maximize", 0,0);
  1883. }
  1884. p = laAddPropertyContainer("ui_layout", "Layout Node", "Property container for single layout", 0,laui_LayoutListItem, sizeof(laLayout), 0,0,1);{
  1885. laAddStringProperty(p, "title", "Title", "The title/name of a panel", 0,0,0,0,1, offsetof(laLayout, ID), 0,0,laset_LayoutTitle,0,LA_AS_IDENTIFIER);
  1886. _LA_PROP_BLOCK = laAddSubGroup(p, "root_block", "Root Block", "Root Block For Panel Docking", "ui_block",0,0,0,offsetof(laLayout, FirstBlock), 0,0,0,0,0,0,0,LA_UDF_SINGLE);
  1887. la_UDFAppendSharedTypePointer("_LA_PROP_BLOCK", _LA_PROP_BLOCK);
  1888. }
  1889. // UI PANEL =========================================================================================
  1890. p = laAddPropertyContainer("ui_panel", "Panel Node", "Property container for general panels", 0,laui_PanelListItem, sizeof(laPanel), lapost_Panel, 0,1);{
  1891. laAddStringProperty(p, "title", "Title", "The title/name of a panel", 0,0,0,0,1, offsetof(laPanel, Title), 0,0,laset_PanelTitle, laread_PanelTitle,LA_AS_IDENTIFIER|LA_TRANSLATE);
  1892. laAddIntProperty(p, "position", "Position", "The Position Of A Panel", 0,"X,Y", "px", 0,0,1, 0,0,offsetof(laPanel, X), 0,0,2, 0,0,0,0,0,0,0,LA_READ_ONLY);
  1893. laAddIntProperty(p, "size", "Size", "The Size Of A Panel", 0,"Width,Height", "px", 0,0,1, 0,0,offsetof(laPanel, W), 0,0,2, 0,0,0,0,0,0,0,LA_READ_ONLY);
  1894. laAddIntProperty(p, "real_xywh", "Real Placemnt", "Placement data in structure", 0,"X,Y,W,H", "px", 0,0,1, 0,0,offsetof(laPanel, TX), 0,0,4, 0,0,0,0,0,0,0,LA_READ_ONLY);
  1895. ep = laAddEnumProperty(p, "snap_enable", "Snap Enable", "Enable Snapping To Edges", 0,"Left,Right,Top,Bottom", 0,0,0,0,0,0,4, 0,laset_PanelSnapEnable, laget_PanelSnapEnable, 0,0,0,0);{
  1896. laAddEnumItem(ep, "no", "No Snap", "Not Snapped to edge", 0);
  1897. laAddEnumItem(ep, "yes", "Snap", "Snapped to edge", U'🞉');
  1898. } //don't swap order with the one below
  1899. laAddIntProperty(p, "snap", "Snap Distance", "Snapping distance to edges", 0,"Left,Right,Top,Bottom", "px", 0,0,1, 0,0,offsetof(laPanel, SL), 0,0,4, 0,laset_PanelSnapDistance, 0,0,0, laread_PanelSnapDistance,0,0);
  1900. laAddIntProperty(p, "show", "Show", "The panel is shown or not", 0,0,0,0,0,1, 0,0,offsetof(laPanel, Show), 0,0,0,0,0,0,0,0,0,0,0);
  1901. laAddIntProperty(p, "mode", "Mode", "Normal/floating/static/modal etc.", 0,0,0,0,0,1, 0,0,offsetof(laPanel, Mode), 0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
  1902. ep = laAddEnumProperty(p, "is_menu_panel", "Is Menu Panel", "Is menu panel", 0,0,0,0,0,offsetof(laPanel, IsMenuPanel), 0,0,0,0,0,0,0,0,0,0);{
  1903. ep->ElementBytes = 1;
  1904. laAddEnumItem(ep, "false", "False", "Not A Menu Panel", U'🞫');
  1905. laAddEnumItem(ep, "true", "IsTrue", "Is A Menu Panel", U'🗩');
  1906. }
  1907. laAddOperatorProperty(p, "hide", "Hide", "Hide this panel", "LA_hide_panel", U'🗕', 0);
  1908. laAddOperatorProperty(p, "dock", "Dock", "Dock this panel", "LA_dock_panel", U'🗖', 0);
  1909. laAddOperatorProperty(p, "close", "Close", "Close this panel", "LA_block_close_panel", U'🞫', 0);
  1910. //laAddSubGroup(p, "Detached Props", "Detached Props", "detached_props",0,0,0,0,0,0,0,0,0,0,0,offsetof(laPanel, PropLinkContainer->Props), 0);
  1911. laAddSubGroup(p, "uil","Ui List", "Panel Main Ui List", "ui_list",0,0,0,offsetof(laPanel, UI), 0,0,0,0,0,0,0,LA_UDF_IGNORE);
  1912. laAddSubGroup(p, "title_uil","Title Ui List", "Panel Title Ui List", "ui_list",0,0,0, offsetof(laPanel, TitleBar), 0,0,0,0,0,0,0,LA_UDF_IGNORE);
  1913. laAddSubGroup(p, "pp","Prop Pack", "Panel Base With Own Instance", "property_package",0,0,0,offsetof(laPanel, PP), 0,0,0,0,0,0,0,LA_UDF_REFER|LA_UDF_IGNORE);
  1914. laAddSubGroup(p, "fake_pp","Fake Prop Pack", "Fake Prop Pack", "property_package",0,0,0,offsetof(laPanel, PropLinkPP), 0,0,0,0,0,0,0,LA_UDF_REFER|LA_UDF_IGNORE);
  1915. laAddSubGroup(p, "parent_block","Parent Block", "The Block That Directly Links This Panel In", "ui_block",0,0,0,offsetof(laPanel, Block), 0,0,0,0,0,0,0,LA_UDF_REFER|LA_UDF_IGNORE);
  1916. laAddSubGroup(p, "template","Template", "Panel template", "panel_template",0,0,0,offsetof(laPanel, PanelTemplate), 0,0,0,0,0,0,0,LA_UDF_REFER);
  1917. laAddSubGroup(p, "block", "Block", "Block reference of this panel", "ui_block",0,0,0,offsetof(laPanel, Block), 0,0,0,0,0,0,0,LA_UDF_REFER);
  1918. //laAddStringProperty(p, "_toolbox_name", "Toolbox Name", "Toolbox name",0,0,0,0,1,offsetof(laPanel,_ToolboxName),0,laget_PanelToolboxName,0,0,LA_READ_ONLY);
  1919. //laAddIntProperty(p, "_toolbox_layout", "Toolbox Layout", "Toolbox layout", 0,0,0,0,0,0,0,0,offsetof(laPanel,_ToolboxLayout),0,0,0,0,laget_PanelToolboxLayout, 0,0,0,0,0,LA_READ_ONLY);
  1920. }
  1921. // UI ITEM ==========================================================================================
  1922. p = laAddPropertyContainer("ui_list", "Ui List", "Property container for ui list sub type", U'⮑', 0,sizeof(laUiList), 0,0,0);{
  1923. laAddStringProperty(p, "tab_name", "Tab Name", "The name of a tab", 0,0,0,0,0,0,0,0,0,0,LA_AS_IDENTIFIER);
  1924. _LA_PROP_UI_ITEM = laAddSubGroup(p, "ui_items", "Ui Items", "Ui Items Listed In Ui List", "ui_item",0,0,0,-1, laget_FirstUiItem, 0,laget_ListNext, 0,0,0,offsetof(laUiList, UiItems), 0);
  1925. la_UDFAppendSharedTypePointer("_LA_PROP_UI_ITEM", _LA_PROP_UI_ITEM);
  1926. laAddSubGroup(p, "column_items", "Column Items", "Ui Items Listed In Ui List", "ui_column",0,0,0,-1, laget_FirstColumnItem, 0,0,0,0,0,offsetof(laUiList, Columns), 0);
  1927. laAddIntProperty(p, "pan", "Pan", "Cavans Panning Pixels", 0,"Pan X,Pan Y", "px", 10000,0,1, 0,0,offsetof(laUiList, PanX), 0,0,2, 0,0,0,0,0,0,0,0);
  1928. laAddSubGroup(p, "instance", "Instance", "Collection Instance For Every Item", "ui_instance",0,0,0,offsetof(laUiList, Instance), 0,0,0,0,0,0,0,LA_UDF_REFER);
  1929. laAddIntProperty(p, "height_coeff", "Height Coefficiency", "How many rows a ui should take or reserve", 0,0,"Rows", 0,0,1, 0,0,offsetof(laUiList, HeightCoeff), 0,0,0,0,0,0,0,0,0,0,0)
  1930. ->ElementBytes = 2;
  1931. }
  1932. p = laAddPropertyContainer("ui_instance", "Instance", "Uilist instance entry", U'🗇', 0,sizeof(laColumn), 0,0,0);{
  1933. //nothing needed
  1934. }
  1935. p = laAddPropertyContainer("ui_column", "Ui Column", "A column handles the aligning of ui items", U'◫', laui_IdentifierOnly, sizeof(laColumn), 0,0,0);{
  1936. laAddFloatProperty(p, "split_at", "Split At", "Split width percentage from left", 0,0,0,1, 0,0.01, 0.5, 0,0,laget_ColumnSP, laset_ColumnSP, 0,0,0,0,0,0,0,0,LA_UDF_IGNORE);
  1937. laAddFloatProperty(p, "real_split", "Real Split", "Float value split pos in real strucutre", 0,0,0,1, 0,0.01, 0.5, 0,offsetof(laColumn, SP), 0,0,0,0,0,0,0,0,0,0,0);
  1938. laAddIntProperty(p, "snap_width", "Snap Width", "Snap width of a column", 0,0,0,200,20,1, 30,0,0,laget_ColumnSnap, laset_ColumnSnap, 0,0,0,0,0,0,0,0,LA_UDF_IGNORE);
  1939. laAddIntProperty(p, "real_snap", "Real Snap", "Int snap value in real structure", 0,0,0,0,0,0,0,0,offsetof(laColumn, MaxW), 0,0,0,0,0,0,0,0,0,0,0);
  1940. ep = laAddEnumProperty(p, "snap_state", "Sub Snap State", "How to snap sub columns", 0,0,0,0,0,0,laget_SnapState, laset_SnapState, 0,0,0,0,0,0,0,LA_UDF_IGNORE);{
  1941. laAddEnumItem(ep, "none", "None", "No Snapping", 0);
  1942. laAddEnumItem(ep, "left", "Left", "Snap At Left", U'⮄');
  1943. laAddEnumItem(ep, "right", "Right", "Snap At Right", U'⮆');
  1944. }
  1945. laAddSubGroup(p, "left", "Left Sub Column", "Left Sub Column", "ui_column",0,0,0,offsetof(laColumn, LS), 0,0,0,0,0,0,0,LA_UDF_REFER);
  1946. laAddSubGroup(p, "right", "Right Sub Column", "Right Sub Column", "ui_column",0,0,0,offsetof(laColumn, RS), 0,0,0,0,0,0,0,LA_UDF_REFER);
  1947. laAddSubGroup(p, "self", "Self", "Self Display", "ui_column",0,LA_WIDGET_COLUMN_VIEWER, 0,-1, laget_Self, 0,0,0,0,0,0,LA_UDF_REFER | LA_AS_IDENTIFIER);
  1948. }
  1949. p = laAddPropertyContainer("panel_template", "Panel Template", "Panel template for creating new panels", 0,0,sizeof(laUiTemplate), 0,0,0);{
  1950. laAddStringProperty(p, "identifier", "Identifier", "Identifier of this template", 0,0,0,0,1, offsetof(laUiTemplate, Identifier), 0,0,0,0,LA_AS_IDENTIFIER);
  1951. laAddStringProperty(p, "title", "Title", "Panel title", 0,0,0,0,1, offsetof(laUiTemplate, Title), 0,0,0,0,LA_TRANSLATE);
  1952. laAddIntProperty(p, "define_func", "Define Func", "Define function distinguish(internal only)", 0,0,0,0,0,0,0,0,offsetof(laUiTemplate, Define), 0,0,0,0,0,0,0,0,0,0,LA_UDF_IGNORE|LA_READ_ONLY);
  1953. }
  1954. p = laAddPropertyContainer("ui_item", "Ui Item", "Property container for ui items", 0,0,sizeof(laUiItem), lapost_UiItem, lapostim_UiItem, 0);{
  1955. laAddIntProperty(p, "location", "Location", "The Ui's Location In A UiList(Prop For Live Edit Only)", 0,"Up", "Down", 0,0,1, 0,0,0,0,0,0,0,0,0,0,0,0,0,LA_AS_IDENTIFIER);
  1956. laAddIntProperty(p, "state", "State", "The ui's internal state", 0,0,0,0,0,1, 0,0,offsetof(laUiItem, State), 0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
  1957. laAddIntProperty(p, "column_layout", "Column Layout", "The ui's column layout", 0,0,0,10,-10,1, 0,0,offsetof(laUiItem, Extent), 0,0,0,0,0,0,0,0,0,0,0)
  1958. ->ElementBytes = sizeof(short);
  1959. laAddStringProperty(p, "path", "Path", "Data path", 0,0,0,0,0,0,0,laget_UiDataPath, 0,laread_UiDataPath,LA_READ_ONLY);
  1960. laAddStringProperty(p, "actuator_id", "Operator ID", "Pure operator with no 'this' pointer", 0,0,0,0,0,0,0,laget_UiOperatorID, 0,laread_UiOperatorID,LA_READ_ONLY);
  1961. laAddSubGroup(p, "pp", "Prop Pack", "Property Package In ui->PP Entry", "property_package",0,0,0,offsetof(laUiItem, PP), 0,0,0,0,0,0,0,LA_UDF_REFER);
  1962. laAddSubGroup(p, "extra_pp", "Extra Prop Pack", "Property Package In ui->ExtraPP Entry", "property_package",0,0,0,offsetof(laUiItem, ExtraPP), 0,0,0,0,0,0,0,LA_UDF_REFER);
  1963. laAddSubGroup(p, "go", "Prop Step Go", "Go Entry (For Determin If This Is A Prop Or Not)", "property_step",0,0,0,offsetof(laUiItem, PP.Go), 0,0,0,0,0,0,0,LA_UDF_REFER | LA_UDF_IGNORE);
  1964. laAddSubGroup(p, "raw_this", "Prop Raw This", "ui->PP.RawThis Entry", "property_package",0,0,0,offsetof(laUiItem, PP.RawThis), 0,0,0,0,0,0,0,LA_UDF_REFER);
  1965. laAddSubGroup(p, "current_page", "Current Page", "Current Page In Sub Ui List", "ui_list",0,0,0,offsetof(laUiItem, Page), 0,0,0,0,0,0,0,LA_UDF_REFER);
  1966. laAddSubGroup(p, "internal_type", "Ui Internal Type", "Ui Internal Type", "ui_type",0,0,0,offsetof(laUiItem, Type), 0,0,0,0,0,0,0,LA_UDF_REFER);
  1967. laAddSubGroup(p, "on_column", "On Column", "Ui On Which Column", "ui_column",0,0,0,offsetof(laUiItem, C), 0,0,0,0,0,0,0,LA_UDF_REFER);
  1968. laAddSubGroup(p, "sub", "Sub UI", "Sub Ui Lists For Tabs And Collection", "ui_list",0,0,0,-1, 0,0,0,0,0,0,offsetof(laUiItem, Subs), 0);
  1969. laAddStringProperty(p, "extra_args", "Extra Arguments", "Extra arguments for this ui item", 0,0,0,0,0,0,0,0,0,0,0);
  1970. laAddStringProperty(p, "display", "Display", "Display string for label", 0,0,0,0,0,0,0,0,0,0,0);
  1971. laAddOperatorProperty(p, "maximize", "Maximize", "Maximize this UI item", "LA_canvas_ui_maximize", 0,0);
  1972. }
  1973. p = laAddPropertyContainer("ui_type", "Ui Type", "Ui type descriptor", 0,laui_IdentifierOnly, sizeof(laUiType), 0,0,0);{
  1974. laAddStringProperty(p, "identifier", "Identifier", "Identifier of this ui type", 0,0,0,0,0,offsetof(laUiType, Identifier), 0,0,0,0,LA_AS_IDENTIFIER|LA_READ_ONLY);
  1975. }
  1976. // NODE ================================================================================================
  1977. p = laAddPropertyContainer("la_out_socket", "Output Socket", "Output socket for nodes", 0,0,sizeof(laNodeOutSocket), 0,0,1);{
  1978. laAddStringProperty(p, "label", "Label", "Socket's label", 0,0,0,0,1, offsetof(laNodeOutSocket, Label), 0,0,0,0,LA_AS_IDENTIFIER);
  1979. laAddIntProperty(p, "data_type", "Data type", "User defined data type", 0,0,0,0,0,0,0,0,offsetof(laNodeOutSocket, DataType), 0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
  1980. laAddIntProperty(p, "array_length", "Array Length", "Array length of data", 0,0,0,0,0,0,0,0,offsetof(laNodeOutSocket, ArrLen), 0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
  1981. laAddSubGroup(p, "parent", "Parent", "Parent node", "la_base_node",0,0,0,offsetof(laNodeOutSocket, Parent), 0,0,0,0,0,0,0,LA_UDF_REFER);
  1982. } LA_PC_SOCKET_OUT = p;
  1983. p = laAddPropertyContainer("la_in_socket", "Input Socket", "Input socket for nodest", 0,0,sizeof(laNodeInSocket), 0,0,1);{
  1984. laAddStringProperty(p, "label", "Label", "Socket's label", 0,0,0,0,1, offsetof(laNodeInSocket, Label), 0,0,0,0,LA_AS_IDENTIFIER);
  1985. sp=laAddSubGroup(p, "source", "Source", "Source socket", "la_out_socket",0,0,offsetof(laNodeInSocket, Source), 0,0,0,0,0,0,0,0,LA_UDF_REFER);
  1986. LA_PROP_SOCKET_SOURCE=sp;
  1987. laAddIntProperty(p, "data_type", "Data type", "User defined data type", 0,0,0,0,0,0,0,0,offsetof(laNodeInSocket, DataType), 0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
  1988. laAddIntProperty(p, "color_id", "Color ID", "Color id of the source wire", 0,0,0,0,0,0,0,0,offsetof(laNodeInSocket, ColorId), 0,0,0,0,0,0,0,0,0,0,0);
  1989. laAddIntProperty(p, "array_length", "Array Length", "Array length of data", 0,0,0,0,0,0,0,0,offsetof(laNodeInSocket, ArrLen), 0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
  1990. } LA_PC_SOCKET_IN = p;
  1991. laPropContainerExtraFunctions(p,0,0,latouched_NodeInSocket,0,0);
  1992. p = laAddPropertyContainer("la_value_mapper", "Value Mapper", "Value mapper", 0,0,sizeof(laValueMapper), 0,0,1);{
  1993. laAddSubGroup(p, "points", "Points", "Points inside the mapper", "la_value_mapper_point",0,0,-1, 0,0,0,0,0,0,0,offsetof(laValueMapper, Points), 0);
  1994. laAddFloatProperty(p, "in_range", "Input Range", "Input range from 0 to 1", 0,"Min,Max", 0,0,0,0,0,0,offsetof(laValueMapper, InRange), 0,0,2, 0,0,0,0,0,0,0,0);
  1995. laAddFloatProperty(p, "out_range", "Output Range", "Output range from 0 to 1", 0,"Min,Max", 0,0,0,0,0,0,offsetof(laValueMapper, OutRange), 0,0,2, 0,0,0,0,0,0,0,0);
  1996. } LA_PC_MAPPER=p;
  1997. p = laAddPropertyContainer("la_value_mapper_point", "Value Mapper", "Value mapper", 0,0,sizeof(laValueMapperPoint), 0,0,1);{
  1998. laAddFloatProperty(p, "position", "Position", "XY Position ranging from 0 to 1", 0,"X,Y", 0,0,0,0,0,0,offsetof(laValueMapperPoint, x), 0,0,2, 0,0,0,0,0,0,0,0);
  1999. }
  2000. // PROPERTIES ==========================================================================================
  2001. p = laAddPropertyContainer("property_item", "Property Item", "Property item for data types like int/float/enum/string/subtype", U'🔌', 0,sizeof(laProp), 0,0,1);{
  2002. laAddStringProperty(p, "identifier", "Identifier", "Property unique identifier", LA_WIDGET_STRING_PLAIN, 0,0,0,0,0,0,laget_PropertyIdentifier, 0,0,LA_AS_IDENTIFIER|LA_READ_ONLY);
  2003. laAddStringProperty(p, "name", "Name", "Property display name", 0,0,0,0,0,offsetof(laProp, Name), 0,0,0,0,LA_READ_ONLY);
  2004. laAddStringProperty(p, "description", "Description", "Property description", 0,0,0,0,0,offsetof(laProp, Description), 0,0,0,0,LA_READ_ONLY);
  2005. laAddIntProperty(p, "prop_type", "Property Type", "Property type(like int/float/enunm/sub)", 0,0,0,0,0,0,0,0,offsetof(laProp, PropertyType), 0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
  2006. laAddIntProperty(p, "icon_id", "Icon Id", "Icon id for current container", 0,0,0,0,0,0,0,0,offsetof(laProp, IconID), 0,0,0,0,0,0,0,0,0,0,0);
  2007. laAddIntProperty(p, "sub_icon_id", "Icon Id", "Icon id for current container", 0,0,0,0,0,0,0,0,0,laget_PropertySubContainerIconID, 0,0,0,0,0,0,0,0,0,0);
  2008. laAddSubGroup(p, "sub", "Sub Type", "Sub Type Property Container", "property_container",0,0,0,offsetof(laProp, SubProp), 0,0,0,0,0,0,0,LA_UDF_REFER);
  2009. }
  2010. p = laAddPropertyContainer("property_container", "Property Container", "Property container for some property items", U'🔌', 0,sizeof(laPropContainer), 0,0,1);{
  2011. laAddStringProperty(p, "identifier", "Identifier", "Property unique identifier", LA_WIDGET_STRING_PLAIN, 0,0,0,0,offsetof(laPropContainer, Identifier), 0,0,0,0,LA_AS_IDENTIFIER | LA_UDF_IGNORE|LA_READ_ONLY);
  2012. laAddStringProperty(p, "name", "Name", "Property display name", 0,0,0,0,0,offsetof(laPropContainer, Name), 0,0,0,0,LA_UDF_IGNORE|LA_READ_ONLY);
  2013. laAddStringProperty(p, "description", "Description", "Property description", 0,0,0,0,0,offsetof(laPropContainer, Name), 0,0,0,0,LA_UDF_IGNORE|LA_READ_ONLY);
  2014. laAddIntProperty(p, "icon_id", "Icon Id", "Icon id for current container", 0,0,0,0,0,0,0,0,offsetof(laPropContainer, IconID), 0,0,0,0,0,0,0,0,0,0,0);
  2015. laAddSubGroup(p, "properties", "Properties", "Single Property", "property_item", laget_PropertyNodeType, 0,0,-1, laget_PropertyItemFirst, laget_PropertyItemFirst, laget_PropertyItemNext, 0,0,0,0,LA_UDF_IGNORE);
  2016. _LA_PROP_FAILED_ITEM = laAddSubGroup(p, "failed_nodes", "Failed Nodes", "Used To Store UDF Failed Nodes", "property_trash_item",0,0,0,-1, 0,0,0,0,0,0,offsetof(laPropContainer, FailedNodes), LA_UDF_IGNORE);
  2017. _LA_PROP_TRASH_ITEM = laAddSubGroup(p, "trash_bin", "Trash Bin", "Used To Store Unlinked Items", "property_trash_item",0,0,0,-1, 0,0,0,0,0,0,offsetof(laPropContainer, TrashBin), LA_UDF_IGNORE);
  2018. laAddOperatorProperty(p, "restore_all", "Restore All", "Restore All Trash Items Or Failed Nodes To A User Selected Linkage", "LA_sub_restore_data_block", U'⭯', 0);
  2019. }
  2020. p = laAddPropertyContainer("property_trash_item", "Trash Item", "Single trash item", 0,0,0,0,0,0);{
  2021. laAddIntProperty(p, "instance_int", "Instance", "Memory address of this data block (int represent)", 0,0,0,0,0,0,0,0,0,laget_TrashItemInstance, 0,0,0,0,0,0,0,0,0,LA_AS_IDENTIFIER|LA_READ_ONLY);
  2022. laAddSubGroup(p, "instance", "Instance", "Single Memory Address Of This Data Block", "property_trash_item",0,0,0,-1, 0,laget_TrashItemInstance, 0,0,0,0,0,LA_UDF_REFER | LA_UDF_IGNORE);
  2023. laAddOperatorProperty(p, "restore", "Restore", "Restore Data Block To A User Selected Linkage", "LA_sub_restore_data_block", U'⭯', 0);
  2024. }
  2025. p = laAddPropertyContainer("property_package", "Property Package", "Property package for data access (mainly ui)", U'🔌', 0,sizeof(laPropPack), 0,0,0);{
  2026. laAddSubGroup(p, "last_step", "Last Step", "Last Prop Step(Segment)", "property_step",0,0,0,offsetof(laPropPack, LastPs), 0,0,0,0,0,0,0,LA_UDF_REFER | LA_UDF_IGNORE);
  2027. }
  2028. p = laAddPropertyContainer("property_step", "Property Step", "Property segment item", 0,0,sizeof(laPropStep), 0,0,0);{
  2029. laAddSubGroup(p, "property", "Property", "Property Reference", "property_item",0,0,0,offsetof(laPropStep, p), 0,0,0,0,0,0,0,LA_UDF_REFER);
  2030. }
  2031. p = laAddPropertyContainer("detached_prop", "Detached Prop", "Detached prop", U'🔌', 0,sizeof(laSubProp) + 48, lapost_DetachedProp, 0,0);{
  2032. laAddSubGroup(p, "raw_this", "Raw This", "Raw This Pointer", "property_package",0,0,0,offsetof(laProp, DetachedPP.RawThis), 0,0,0,0,0,0,0,LA_UDF_REFER);
  2033. laAddStringProperty(p, "path", "Path", "Data path", 0,0,0,0,0,0,0,laget_DetachedPropPath, 0,laread_DetachedPropPath, 0);
  2034. laAddStringProperty(p, "rename", "Rename", "Rename", 0,0,0,0,0,offsetof(laProp, Identifier), 0,0,0,laread_DetachedPropRename, 0);
  2035. }
  2036. p = laAddPropertyContainer("la_animation", "Animation", "Animation data",0,0,sizeof(laAnimation),0,0,1);{
  2037. sp = laAddSubGroup(p, "action_holders", "Action Holders", "All action holders","la_animation_action_holder",0,0,0,-1,0,0,0,0,0,0,offsetof(laAnimation,ActionHolders),LA_UDF_IGNORE);
  2038. laSubGroupExtraFunctions(sp,0,0,0,0,laget_AnimationActionHolderCategory);
  2039. laAddSubGroup(p, "current_action", "Current Action", "Current action","la_animation_action",0,0,0,offsetof(laAnimation,CurrentAction),0,0,0,0,0,0,0,LA_UDF_REFER|LA_READ_ONLY);
  2040. laAddFloatProperty(p, "play_head","Play Head","Animation viewer global playhead",0,0,"s",0,0,0.01,0,0,offsetof(laAnimation,PlayHead),0,laset_AnimationPlayHead,0,0,0,0,0,0,0,0,0);
  2041. ep=laAddEnumProperty(p, "play_status", "Play Status", "Animation viewer global play status", 0,0,0,0,0,offsetof(laAnimation, PlayStatus),0,0,0,0,0,0,0,0,0,0);
  2042. laAddEnumItemAs(ep, "PAUSED", "Paused", "Animation is playing", LA_ANIMATION_STATUS_PAUSED, U'⏸');
  2043. laAddEnumItemAs(ep, "PLAY_FWD", "Playing", "File data is untouched", LA_ANIMATION_STATUS_PLAY_FWD,U'▶');
  2044. laAddEnumItemAs(ep, "PLAY_REV", "Reversing", "File data is untouched", LA_ANIMATION_STATUS_PLAY_REV,U'◀');
  2045. }
  2046. p = laAddPropertyContainer("la_animation_action", "Action", "Animation action",0,0,sizeof(laAction),0,0,1);{
  2047. laAddStringProperty(p,"name","Name","Name of the action",0,0,0,0,1,offsetof(laAction,Name),0,0,0,0,LA_AS_IDENTIFIER);
  2048. laAddStringProperty(p,"container","Container","Container of the action parent",0,0,0,0,0,0,0,laget_ActionContainer,0,laread_ActionContainer,LA_READ_ONLY);
  2049. laAddSubGroup(p, "holder", "Holder", "Holder data block", "any_pointer",0,0,0,offsetof(laAction, HolderInstance), 0,0,0,0,0,0,0,LA_UDF_REFER|LA_READ_ONLY);
  2050. laAddSubGroup(p, "holder_h2", "Holder H2", "Holder data block (hyper 2)", "any_pointer_h2",0,0,0,offsetof(laAction, HolderInstance), 0,0,0,0,0,0,0,LA_UDF_REFER|LA_READ_ONLY);
  2051. laAddSubGroup(p, "channels", "Channels", "Action channels", "la_animation_channel",0,0,0,-1,0,0,0,0,0,0,offsetof(laAction, Channels),0);
  2052. laAddFloatProperty(p, "length","Length","Length of the action in seconds",0,0,"s",30,0,0.1,2,0,offsetof(laAction,Length),0,0,0,0,0,0,0,0,0,0,0);
  2053. laAddFloatProperty(p, "play_head","Play Head","Play head position",0,0,0,1.0,0,0.01,0,0,offsetof(laAction,PlayHead),0,0,0,0,0,0,0,0,0,0,0);
  2054. laAddFloatProperty(p, "offset","Offset","Play head offset from global timing",0,0,0,1.0,0,0.01,0,0,offsetof(laAction,Offset),0,0,0,0,0,0,0,0,0,0,0);
  2055. laAddIntProperty(p, "frame_count","Frame Count","Total frame count in the whole length of the action",0,0,0,960,1,0,24,0,offsetof(laAction,FrameCount),0,0,0,0,0,0,0,0,0,0,0);
  2056. laAddIntProperty(p, "current_frame","Current Frame","Current frame in this action",0,0,0,0,0,0,0,0,0,laget_AnimationActionCurrentFrame,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
  2057. ep = laAddEnumProperty(p, "mute", "Mute", "Mute this action", 0,0,0,0,0,offsetof(laAction, Mute),0,0,0,0,0,0,0,0,0,0);{
  2058. laAddEnumItemAs(ep, "NONE", "None", "Not muted", 0,0);
  2059. laAddEnumItemAs(ep, "MUTE", "Mute", "Muted", 1,0);
  2060. }
  2061. ep = laAddEnumProperty(p, "solo", "Solo", "Solo play this action", 0,0,0,0,0,offsetof(laAction, Solo),0,0,0,0,0,0,0,0,0,0);{
  2062. laAddEnumItemAs(ep, "NONE", "None", "Play this action with", 0,0);
  2063. laAddEnumItemAs(ep, "SOLO", "Solo", "Solo play", 1,0);
  2064. }
  2065. ep = laAddEnumProperty(p, "play_by_default", "Auto Play", "Automatically play this animation when player starts", 0,0,0,0,0,offsetof(laAction, PlayByDefault),0,0,0,0,0,0,0,0,0,0);{
  2066. laAddEnumItemAs(ep, "NONE", "Stop", "Player initialize the animation in stopped state", 0,0);
  2067. laAddEnumItemAs(ep, "PLAY", "Play", "Animation automatically plays when player starts", 1,0);
  2068. }
  2069. ep = laAddEnumProperty(p, "play_mode", "Play Mode", "How to play this action", 0,0,0,0,0,offsetof(laAction, PlayMode),0,0,0,0,0,0,0,0,0,0);{
  2070. laAddEnumItemAs(ep, "REPEAT", "Repeat", "Play action in repeat", LA_ANIMATION_PLAY_MODE_REPEAT, U'⮆');
  2071. laAddEnumItemAs(ep, "HOLD", "Hold", "Hold end values when time is outside time range", LA_ANIMATION_PLAY_MODE_HOLD,U'⭲');
  2072. laAddEnumItemAs(ep, "BOUNCE", "Bounce", "Play action back and forth", LA_ANIMATION_PLAY_MODE_BOUNCE,U'⮀');
  2073. }
  2074. ep = laAddEnumProperty(p, "mix_mode", "Mix", "How this action is mixed with existing ones", 0,0,0,0,0,offsetof(laAction, MixMode),0,0,0,0,0,0,0,0,0,0);{
  2075. laAddEnumItemAs(ep, "REPLACE", "Replace", "Replace previously set values", LA_ANIMATION_MIX_REPLACE,0);
  2076. laAddEnumItemAs(ep, "ADD", "Add", "Add on top of previously set values", LA_ANIMATION_MIX_ADD,0);
  2077. }
  2078. laAddOperatorProperty(p,"remove","Remove","Remove this action","LA_animation_remove_action",L'🞫',0);
  2079. }
  2080. p = laAddPropertyContainer("la_animation_channel", "Channel", "Action channel",0,0,sizeof(laActionChannel),0,0,1);{
  2081. laAddSubGroup(p, "keys", "Keys", "Key Frames", "la_animation_key",0,0,0,-1,0,0,0,0,0,0,offsetof(laActionChannel, Keys),0);
  2082. laAddSubGroup(p, "ap", "Animation Property", "Animation property reference", "la_animation_prop",0,0,0,offsetof(laActionChannel, AP), 0,0,0,0,0,0,0,LA_UDF_REFER);
  2083. }
  2084. p = laAddPropertyContainer("la_animation_prop", "Property", "Animation property",0,0,sizeof(laActionProp),0,0,1);{
  2085. laAddIntProperty(p, "data_size","Data Size","Data size of the channel",0,0,0,0,0,0,0,0,offsetof(laActionProp,DataSize),0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
  2086. laAddStringProperty(p,"prop_str","Property String","Property of this channel",0,0,0,0,0,0,0,laget_AnimationPropStr,0,laread_AnimationPropStr,LA_READ_ONLY);
  2087. laAddStringProperty(p,"cached_str","Cached String","Property name of this channel",0,0,0,0,1,offsetof(laActionProp,CachedName),0,0,0,0,LA_READ_ONLY|LA_AS_IDENTIFIER);
  2088. laAddSubGroup(p, "for", "For", "Target data block", "any_pointer",0,0,0,offsetof(laActionProp, For), 0,0,0,0,0,0,0,LA_UDF_REFER);
  2089. laAddSubGroup(p, "for_h2", "For H2", "Target data block (hyper 2)", "any_pointer_h2",0,0,0,offsetof(laActionProp, For), 0,0,0,0,0,0,0,LA_UDF_REFER);
  2090. }
  2091. p = laAddPropertyContainer("la_animation_key", "key", "Action channel",0,0,sizeof(laActionKey),0,0,1);{
  2092. laAddIntProperty(p, "at","At","Frame number of this key frame",0,0,0,0,0,0,0,0,offsetof(laActionKey,At),0,0,0,0,0,0,0,0,0,0,0);
  2093. laAddRawProperty(p,"data","Data","Data of this key frame",0,0,lagetraw_ActionKeyData,lasetraw_ActionKeyData,0);
  2094. }
  2095. p = laAddPropertyContainer("la_animation_action_holder", "Action Holder", "Action holder",0,0,sizeof(laActionHolder),0,0,1);{
  2096. laAddStringProperty(p,"name","Name","Name of the action",0,0,0,0,1,offsetof(laActionHolder,Name),0,0,0,0,LA_AS_IDENTIFIER);
  2097. laAddIntProperty(p,"action_offset","Action Offset","List handle offset of the action list in the instance",0,0,0,0,0,0,0,0,offsetof(laActionHolder,ActionOffset),0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
  2098. laAddIntProperty(p,"prop_offset","Prop Offset","List handle offset of the property list in the instance",0,0,0,0,0,0,0,0,offsetof(laActionHolder,PropOffset),0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
  2099. }
  2100. }
  2101. la_RegisterTNSProps();
  2102. }
  2103. void la_RegisterDefaultSignals(){
  2104. laNewCustomSignal("la.new",LA_SIGNAL_NEW);
  2105. laNewCustomSignal("la.delete",LA_SIGNAL_DELETE);
  2106. laNewCustomSignal("la.confirm",LA_SIGNAL_CONFIRM);
  2107. laNewCustomSignal("la.undo",LA_SIGNAL_UNDO);
  2108. laNewCustomSignal("la.redo",LA_SIGNAL_REDO);
  2109. laNewCustomSignal("la.open",LA_SIGNAL_OPEN);
  2110. laNewCustomSignal("la.save",LA_SIGNAL_SAVE);
  2111. laNewCustomSignal("la.save_as",LA_SIGNAL_SAVE_AS);
  2112. laNewCustomSignal("la.layout_next",LA_SIGNAL_LAYOUT_NEXT);
  2113. laNewCustomSignal("la.layout_prev",LA_SIGNAL_LAYOUT_PREV);
  2114. laNewCustomSignal("la.fullscreen",LA_SIGNAL_FULLSCREEN);
  2115. laInputMapping* im=laNewInputMapping("Default");
  2116. laNewInputMappingEntryP(im,LA_INPUT_DEVICE_KEYBOARD,0,"z",LA_KEY_CTRL,LA_SIGNAL_UNDO);
  2117. laNewInputMappingEntryP(im,LA_INPUT_DEVICE_KEYBOARD,0,"z",LA_KEY_CTRL|LA_KEY_SHIFT,LA_SIGNAL_REDO);
  2118. laNewInputMappingEntryP(im,LA_INPUT_DEVICE_KEYBOARD,0,"o",LA_KEY_CTRL,LA_SIGNAL_OPEN);
  2119. laNewInputMappingEntryP(im,LA_INPUT_DEVICE_KEYBOARD,0,"s",LA_KEY_CTRL,LA_SIGNAL_SAVE);
  2120. laNewInputMappingEntryP(im,LA_INPUT_DEVICE_KEYBOARD,0,"s",LA_KEY_CTRL|LA_KEY_SHIFT,LA_SIGNAL_SAVE_AS);
  2121. laNewInputMappingEntryP(im,LA_INPUT_DEVICE_KEYBOARD,0,"Right",LA_KEY_CTRL,LA_SIGNAL_LAYOUT_NEXT);
  2122. laNewInputMappingEntryP(im,LA_INPUT_DEVICE_KEYBOARD,0,"Left",LA_KEY_CTRL,LA_SIGNAL_LAYOUT_PREV);
  2123. laNewInputMappingEntryP(im,LA_INPUT_DEVICE_KEYBOARD,0,"F11",0,LA_SIGNAL_FULLSCREEN);
  2124. laNewInputMappingEntryP(im,LA_INPUT_DEVICE_KEYBOARD,0,"a",LA_KEY_SHIFT,"la.new");
  2125. laNewInputMappingEntryP(im,LA_INPUT_DEVICE_KEYBOARD,0,"x",0,"la.delete");
  2126. }