Blinds/Trays and Lavs

This commit is contained in:
Kilian Hofmann 2025-10-15 20:53:19 +02:00
parent 4e778ca82c
commit 165ebfffe3
13 changed files with 8973 additions and 6114 deletions

16
.vscode/launch.json vendored Normal file
View File

@ -0,0 +1,16 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Launch JS",
"skipFiles": ["<node_internals>/**"],
"program": "${workspaceFolder}\\scripts\\${fileBasename}",
"cwd": "${workspaceFolder}\\scripts"
}
]
}

View File

@ -499,9 +499,13 @@
<IMDefault>
<Cursor>Grab</Cursor>
</IMDefault>
<IMDrag>
<Cursor>Grab</Cursor>
</IMDrag>
</IMCursorsInstances>
<IMMouseFlagsInstances>
<IMDefault>Lock+Unlock+LeftDrag+Wheel</IMDefault>
<IMDefault>Lock+Unlock+LeftDrag</IMDefault>
<IMDrag>Lock+Unlock+LeftDrag</IMDrag>
</IMMouseFlagsInstances>
<Lock>True</Lock>
<LockFlagsTemporary>LeftSingle</LockFlagsTemporary>
@ -518,6 +522,16 @@
}
}
</IMDefault>
<IMDrag>
90 (L:#SECOND_VAR_X_NAME#) - (&gt;O:MAX)
(M:Event) 'LeftDrag' scmi 0 == if{
(L:#VAR_X_NAME#) (M:DragPercent) 100 * (L:#VAR_X_NAME#) - + (&gt;O:NEW)
(O:NEW) (O:MAX) &lt; if{
(O:NEW) (&gt;L:#VAR_X_NAME#)
}
}
</IMDrag>
</IMCodeInstances>
<DragMode>Trajectory</DragMode>
<DragAnimName>#ANIM_X_NAME#</DragAnimName>
@ -542,9 +556,13 @@
<IMDefault>
<Cursor>Grab</Cursor>
</IMDefault>
<IMDrag>
<Cursor>Grab</Cursor>
</IMDrag>
</IMCursorsInstances>
<IMMouseFlagsInstances>
<IMDefault>Lock+Unlock+LeftDrag+Wheel</IMDefault>
<IMDefault>Lock+Unlock+LeftDrag</IMDefault>
<IMDrag>Lock+Unlock+LeftDrag</IMDrag>
</IMMouseFlagsInstances>
<Lock>True</Lock>
<LockFlagsTemporary>LeftSingle</LockFlagsTemporary>
@ -553,9 +571,16 @@
<IMCodeInstances>
<IMDefault>
(M:Event) 'LeftDrag' scmi 0 == if{
(L:#VAR_X_NAME#) (M:DragPercent) 100 * (L:#VAR_X_NAME#) - + (&gt;L:#VAR_Y_NAME#)
(L:#VAR_Y_NAME#) (M:DragPercent) #ANIM_LENGTH# * (L:#VAR_Y_NAME#) - +
(&gt;L:#VAR_Y_NAME#)
}
</IMDefault>
<IMDrag>
(M:Event) 'LeftDrag' scmi 0 == if{
(L:#VAR_Y_NAME#) (M:DragPercent) #ANIM_LENGTH# * (L:#VAR_Y_NAME#) - +
(&gt;L:#VAR_Y_NAME#)
}
</IMDrag>
</IMCodeInstances>
<DragMode>Trajectory</DragMode>
<DragAnimName>#ANIM_Y_NAME#</DragAnimName>
@ -568,4 +593,206 @@
</MouseRect>
</Component>
</Template>
<Template Name="MD11_Blind">
<Parameters Type="Default">
<ANIM_LENGTH>42</ANIM_LENGTH>
<ANIM_LAG>42</ANIM_LAG>
</Parameters>
<Component ID="#NODE_NAME#" Node="#NODE_NAME#">
<Animation Name="#ANIM_NAME#" Length="#ANIM_LENGTH#" Type="Sim"
TypeParam="AutoPlay">
<Parameter>
<Code>(O:POS)</Code>
<Lag>#ANIM_LAG#</Lag>
</Parameter>
</Animation>
<MouseRect>
<IMCursorsInstances>
<IMDefault>
<Cursor>Grab</Cursor>
</IMDefault>
<IMDrag>
<Cursor>Grab</Cursor>
</IMDrag>
</IMCursorsInstances>
<IMMouseFlagsInstances>
<IMDefault>Lock+Unlock+LeftDrag</IMDefault>
<IMDrag>Lock+Unlock+LeftDrag</IMDrag>
</IMMouseFlagsInstances>
<Lock>True</Lock>
<LockFlagsTemporary>LeftSingle</LockFlagsTemporary>
<HighlightNodeId>#NODE_NAME#</HighlightNodeId>
<CallbackCode>
<IMCodeInstances>
<IMDefault>
(M:Event) 'LeftDrag' scmi 0 == if{
(O:POS) (M:DragPercent) #ANIM_LENGTH# * (O:POS) - + (&gt;O:POS)
}
</IMDefault>
<IMDrag>
(M:Event) 'LeftDrag' scmi 0 == if{
(O:POS) (M:DragPercent) #ANIM_LENGTH# * (O:POS) - + (&gt;O:POS)
}
</IMDrag>
</IMCodeInstances>
<DragMode>Trajectory</DragMode>
<DragAnimName>#ANIM_NAME#</DragAnimName>
<DragNodeId>#NODE_NAME#</DragNodeId>
<DragAnimSynced>True</DragAnimSynced>
<DragUseAnimLag>True</DragUseAnimLag>
<DragAxis>Y</DragAxis>
<DragFlagsLockable>LeftDrag+RightDrag+MiddleDrag</DragFlagsLockable>
</CallbackCode>
</MouseRect>
</Component>
</Template>
<Template Name="MD11_Bin">
<Parameters Type="Default">
<ANIM_LENGTH>10</ANIM_LENGTH>
<ANIM_LAG>10</ANIM_LAG>
</Parameters>
<Component ID="#NODE_NAME#" Node="#NODE_NAME#">
<Animation Name="#ANIM_NAME#" Length="#ANIM_LENGTH#" Type="Sim"
TypeParam="AutoPlay">
<Parameter>
<Code>(O:POS)</Code>
<Lag>#ANIM_LAG#</Lag>
</Parameter>
</Animation>
<MouseRect>
<IMCursorsInstances>
<IMDefault>
<Cursor>Grab</Cursor>
</IMDefault>
<IMDrag>
<Cursor>Grab</Cursor>
</IMDrag>
</IMCursorsInstances>
<IMMouseFlagsInstances>
<IMDefault>Lock+Unlock+LeftDrag</IMDefault>
<IMDrag>Lock+Unlock+LeftDrag</IMDrag>
</IMMouseFlagsInstances>
<Lock>True</Lock>
<LockFlagsTemporary>LeftSingle</LockFlagsTemporary>
<HighlightNodeId>#NODE_NAME#</HighlightNodeId>
<CallbackCode>
<IMCodeInstances>
<IMDefault>
(M:Event) 'LeftDrag' scmi 0 == if{
(O:POS) (M:DragPercent) #ANIM_LENGTH# * (O:POS) - + (&gt;O:POS)
}
</IMDefault>
<IMDrag>
(M:Event) 'LeftDrag' scmi 0 == if{
(O:POS) (M:DragPercent) #ANIM_LENGTH# * (O:POS) - + (&gt;O:POS)
}
</IMDrag>
</IMCodeInstances>
<DragMode>Trajectory</DragMode>
<DragAnimName>#ANIM_NAME#</DragAnimName>
<DragNodeId>#NODE_NAME#</DragNodeId>
<DragAnimSynced>True</DragAnimSynced>
<DragUseAnimLag>True</DragUseAnimLag>
<DragAxis>Y</DragAxis>
<DragFlagsLockable>LeftDrag+RightDrag+MiddleDrag</DragFlagsLockable>
</CallbackCode>
</MouseRect>
</Component>
</Template>
<Template Name="MD11_TrayTable">
<Parameters Type="Default">
<ANIM_LENGTH>25</ANIM_LENGTH>
<ANIM_LAG>25</ANIM_LAG>
</Parameters>
<Parameters Type="Override">
<Condition Check="ANIM_NAME">
<False>
<ANIM_NAME>#NODE_NAME#</ANIM_NAME>
</False>
</Condition>
<Condition Check="ID">
<False>
<ID>#NODE_NAME#</ID>
</False>
</Condition>
</Parameters>
<Component ID="#ID#" Node="#NODE_NAME#">
<UseTemplate Name="ASOBO_GT_MouseRect">
<MOUSEFLAGS_DEFAULT_IM>LeftSingle</MOUSEFLAGS_DEFAULT_IM>
<MOUSEFLAGS_DRAG_IM>LeftSingle</MOUSEFLAGS_DRAG_IM>
<CURSOR_DEFAULT_IM>Hand</CURSOR_DEFAULT_IM>
<CURSOR_DRAG_IM>Hand</CURSOR_DRAG_IM>
<CALLBACKCODE_DEFAULT_IM>
(M:Event) &apos;LeftSingle&apos; scmi 0 == if{ (O:CLICK) ! (&gt;O:CLICK) }
</CALLBACKCODE_DEFAULT_IM>
<CALLBACKCODE_DRAG_IM>
(M:Event) &apos;LeftSingle&apos; scmi 0 == if{ (O:CLICK) ! (&gt;O:CLICK) }
</CALLBACKCODE_DRAG_IM>
</UseTemplate>
<Animation Name="#ANIM_NAME#" Length="#ANIM_LENGTH#" Type="Sim" TypeParam="AutoPlay">
<Parameter>
<Code>(O:CLICK) #ANIM_LENGTH# *</Code>
<Lag>#ANIM_LAG#</Lag>
</Parameter>
</Animation>
</Component>
</Template>
<Template Name="MD11_Lav">
<Component ID="#ID#">
<Component ID="#NODE_LATCH_NAME#" Node="#NODE_LATCH_NAME#">
<UseTemplate Name="ASOBO_GT_MouseRect">
<MOUSEFLAGS_DEFAULT_IM>LeftSingle</MOUSEFLAGS_DEFAULT_IM>
<MOUSEFLAGS_DRAG_IM>LeftSingle</MOUSEFLAGS_DRAG_IM>
<CURSOR_DEFAULT_IM>Hand</CURSOR_DEFAULT_IM>
<CURSOR_DRAG_IM>Hand</CURSOR_DRAG_IM>
<CALLBACKCODE_DEFAULT_IM>
(M:Event) &apos;LeftSingle&apos; scmi 0 == (L:#ID#_DOOR) 0 == &amp;&amp; if{
(L:#ID#_LATCH) ! (&gt;L:#ID#_LATCH)
}
</CALLBACKCODE_DEFAULT_IM>
<CALLBACKCODE_DRAG_IM>
(M:Event) &apos;LeftSingle&apos; scmi 0 == (L:#ID#_DOOR) 0 == &amp;&amp; if{
(L:#ID#_LATCH) ! (&gt;L:#ID#_LATCH)
}
</CALLBACKCODE_DRAG_IM>
</UseTemplate>
<Animation Name="#ANIM_LATCH_NAME#" Length="#ANIM_LATCH_LENGTH#" Type="Sim"
TypeParam="AutoPlay">
<Parameter>
<Code>(L:#ID#_LATCH) #ANIM_LATCH_LENGTH# *</Code>
<Lag>#ANIM_LATCH_LAG#</Lag>
</Parameter>
</Animation>
</Component>
<Component ID="#NODE_DOOR_NAME#" Node="#NODE_DOOR_NAME#">
<UseTemplate Name="ASOBO_GT_MouseRect">
<MOUSEFLAGS_DEFAULT_IM>LeftSingle</MOUSEFLAGS_DEFAULT_IM>
<MOUSEFLAGS_DRAG_IM>LeftSingle</MOUSEFLAGS_DRAG_IM>
<CURSOR_DEFAULT_IM>Hand</CURSOR_DEFAULT_IM>
<CURSOR_DRAG_IM>Hand</CURSOR_DRAG_IM>
<CALLBACKCODE_DEFAULT_IM>
(M:Event) &apos;LeftSingle&apos; scmi 0 == (L:#ID#_LATCH) 0 == &amp;&amp; if{
(L:#ID#_DOOR) ! (&gt;L:#ID#_DOOR)
}
</CALLBACKCODE_DEFAULT_IM>
<CALLBACKCODE_DRAG_IM>
(M:Event) &apos;LeftSingle&apos; scmi 0 == (L:#ID#_LATCH) 0 == &amp;&amp; if{
(L:#ID#_DOOR) ! (&gt;L:#ID#_DOOR)
}
</CALLBACKCODE_DRAG_IM>
</UseTemplate>
<Animation Name="#ANIM_DOOR_NAME#" Length="#ANIM_DOOR_LENGTH#" Type="Sim"
TypeParam="AutoPlay">
<Parameter>
<Code>(L:#ID#_DOOR) #ANIM_DOOR_LENGTH# *</Code>
<Lag>#ANIM_DOOR_LAG#</Lag>
</Parameter>
</Animation>
</Component>
</Component>
</Template>
</ModelBehaviors>

View File

@ -10,6 +10,7 @@
<Behaviors>
<Include RelativeFile="..\..\TFDi_Design_MD-11_Shared\TFDi_MD11_INT_BASE.xml" />
<Include RelativeFile="..\..\TFDi_Design_MD-11_Shared\TFDi_MD11_INT_PAX.xml" />
<Include RelativeFile="..\..\TFDi_Design_MD-11_Shared\TFDi_MD11_INT_CABIN.xml" />
<Include RelativeFile="..\..\..\Misc\TFDi_Design_MD-11_Fixes\TFDi_Design_MD-11_Fixes_BASE.xml" />
<Component ID="TFDi_MD11_INT_BASE">
@ -23,6 +24,10 @@
<Component ID="TFDi_MD11_INT_PAX">
<UseTemplate Name="MD11_PAX" />
</Component>
<Component ID="TFDi_MD11_INT_CABIN">
<UseTemplate Name="MD11_CABIN" />
</Component>
</Behaviors>

View File

@ -10,6 +10,7 @@
<Behaviors>
<Include RelativeFile="..\..\TFDi_Design_MD-11_Shared\TFDi_MD11_INT_BASE.xml" />
<Include RelativeFile="..\..\TFDi_Design_MD-11_Shared\TFDi_MD11_INT_PAX.xml" />
<Include RelativeFile="..\..\TFDi_Design_MD-11_Shared\TFDi_MD11_INT_CABIN.xml" />
<Include RelativeFile="..\..\..\Misc\TFDi_Design_MD-11_Fixes\TFDi_Design_MD-11_Fixes_BASE.xml" />
<Component ID="TFDi_MD11_INT_BASE">
@ -23,6 +24,10 @@
<Component ID="TFDi_MD11_INT_PAX">
<UseTemplate Name="MD11_PAX" />
</Component>
<Component ID="TFDi_MD11_INT_CABIN">
<UseTemplate Name="MD11_CABIN" />
</Component>
</Behaviors>

View File

@ -40,9 +40,6 @@
<Component ID="TFDi_MD11_INT_MISC">
<UseTemplate Name="MD11_MISC" />
</Component>
<Component ID="TFDi_MD11_INT_EXTRAS">
<UseTemplate Name="MD11_EXTRAS" />
</Component>
<Component ID="TFDi_MD11_INT_LIGHTING">
<UseTemplate Name="TFDi_MD11_INT_LIGHTING" />

View File

@ -2164,9 +2164,6 @@
<UseTemplate Name="MD11_Annunciator">
<NODE_ID>MD11_THR_R_FUEL_LT</NODE_ID>
</UseTemplate>
<UseTemplate Name="MD11_Annunciator">
<NODE_ID>MD11_THR_PARK_LT</NODE_ID>
</UseTemplate>
<UseTemplate Name="MD11_Annunciator">
<NODE_ID>MD11_LMCDU_DSPY_LT</NODE_ID>
</UseTemplate>

View File

@ -372,13 +372,6 @@
<ANIM_LENGTH>100</ANIM_LENGTH>
<ANIM_LAG>1000</ANIM_LAG>
</UseTemplate>
<!-- NOTE: Missing animation -->
<UseTemplate Name="MD11_Animation">
<NODE_NAME>MD11_EXT_GPU_DOOR</NODE_NAME>
<ANIM_LENGTH>10</ANIM_LENGTH>
<ANIM_LAG>100</ANIM_LAG>
<ANIM_CODE>(L:MD11_EXT_GPU) 10 *</ANIM_CODE>
</UseTemplate>
<!-- DOORS END -->
<!-- ADG LEVER START -->

22
scripts/bins.js Normal file
View File

@ -0,0 +1,22 @@
import fs from "fs";
const file = fs.readFileSync("TFDi_MD11_PAX_CABIN_LOD0.gltf", {
encoding: "utf-8",
});
const model = JSON.parse(file);
model.animations.forEach((anim) => {
if (anim.name.includes("MD11_CAB_OVHDBIN")) {
const id = Number.parseInt(anim.channels[0].target.node);
const node = model.nodes[id];
const child = model.nodes[node.children[0]];
console.log(
`<UseTemplate Name="MD11_Bin">
<NODE_NAME>${child.name}</NODE_NAME>
<ANIM_NAME>${anim.name}</ANIM_NAME>
</UseTemplate>`
);
}
});

22
scripts/blinds.js Normal file
View File

@ -0,0 +1,22 @@
import fs from "fs";
const file = fs.readFileSync("TFDi_MD11_PAX_CABIN_LOD0.gltf", {
encoding: "utf-8",
});
const model = JSON.parse(file);
model.animations.forEach((anim) => {
if (anim.name.includes("MD11_CAB_WINDOWBLINDS")) {
const id = Number.parseInt(anim.channels[0].target.node);
const node = model.nodes[id];
const child = model.nodes[node.children[0]];
console.log(
`<UseTemplate Name="MD11_Blind">
<NODE_NAME>${child.name}</NODE_NAME>
<ANIM_NAME>${anim.name}</ANIM_NAME>
</UseTemplate>`
);
}
});

26
scripts/econTrays.js Normal file
View File

@ -0,0 +1,26 @@
import fs from "fs";
const file = fs.readFileSync("TFDi_MD11_PAX_CABIN_LOD0.gltf", {
encoding: "utf-8",
});
const model = JSON.parse(file);
model.animations.forEach((anim) => {
if (anim.name.includes("MD11_CAB_ECON_TRAY")) {
let done = false;
anim.channels.forEach((channel) => {
const id = Number.parseInt(channel.target.node);
const node = model.nodes[id];
if (!done && node.name.includes("Clip")) {
done = true;
console.log(
`<UseTemplate Name="MD11_TrayTable">
<NODE_NAME>${node.name}</NODE_NAME>
<ANIM_NAME>${anim.name}</ANIM_NAME>
</UseTemplate>`
);
}
});
}
});

35
scripts/firstTrays.js Normal file
View File

@ -0,0 +1,35 @@
import fs from "fs";
const file = fs.readFileSync("TFDi_MD11_PAX_CABIN_LOD0.gltf", {
encoding: "utf-8",
});
const model = JSON.parse(file);
model.animations.forEach((anim) => {
if (anim.name.includes("MD11_CAB_FIRST_TRAY")) {
let done = false;
anim.channels.forEach((channel) => {
const id = Number.parseInt(channel.target.node);
const node = model.nodes[id];
const child = model.nodes.find(
(_child, index) =>
node &&
node.children &&
node.children.includes(index) &&
_child.name.includes("WheelArm")
);
if (!done && child && child.name.includes("WheelArm")) {
done = true;
console.log(
`<UseTemplate Name="MD11_TrayTable">
<NODE_NAME>${child.name}</NODE_NAME>
<ANIM_NAME>${anim.name}</ANIM_NAME>
<ANIM_LENGTH>50</ANIM_LENGTH>
<ANIM_LAG>50</ANIM_LAG>
</UseTemplate>`
);
}
});
}
});