From 9b0cc2524ba9f91b655c780bbfdd4def99955e4e Mon Sep 17 00:00:00 2001 From: turanszkij Date: Mon, 9 Mar 2020 19:55:11 +0000 Subject: [PATCH] transform hierarchy fix #76 --- Documentation/WickedEngine-Documentation.md | 4 +- Editor/CameraWindow.cpp | 2 +- Editor/Editor.cpp | 46 +++----------------- Editor/ForceFieldWindow.cpp | 2 +- Editor/MaterialWindow.cpp | 2 +- Editor/MeshWindow.cpp | 2 +- Editor/ModelImporter_GLTF.cpp | 9 ++-- Editor/ObjectWindow.cpp | 2 +- Editor/PostprocessWindow.cpp | 2 +- Tests/Tests.cpp | 1 - WickedEngine/ArchiveVersionHistory.txt | 1 + WickedEngine/wiArchive.cpp | 2 +- WickedEngine/wiGUI.cpp | 16 ++++++- WickedEngine/wiGUI.h | 16 ++----- WickedEngine/wiScene.cpp | 23 ++++++---- WickedEngine/wiScene.h | 6 +-- WickedEngine/wiScene_Serializers.cpp | 7 ++- WickedEngine/wiVersion.cpp | 2 +- WickedEngine/wiWidget.cpp | 11 ++++- models/Havoc/havoc.wiscene | Bin 5144582 -> 5140307 bytes models/girl.wiscene | Bin 153874 -> 152159 bytes 21 files changed, 70 insertions(+), 86 deletions(-) diff --git a/Documentation/WickedEngine-Documentation.md b/Documentation/WickedEngine-Documentation.md index 878a52f63..103f16ed2 100644 --- a/Documentation/WickedEngine-Documentation.md +++ b/Documentation/WickedEngine-Documentation.md @@ -800,8 +800,8 @@ The custom GUI, implemented with engine features [[Header]](../WickedEngine/wiGUI.h) [[Cpp]](../WickedEngine/wiGUI.cpp) The wiGUI is responsible to run a GUI interface and manage widgets. -GUI Scaling: The wiGUI is created with a default size of (1920*1080), so by default, placing elements (widgets) onto the GUI will be relative to this resolution. This can be freely modified by calling the `wiGUI::SetSize()` function. -When the GUI is updated (usually done by [RenderPath2D](#renderpath2d) automatically), the GUI size will take the current screen size, and scale the contents accordingly. When the application window is resized, the GUI scaling will take effect automatically. When adding widgets to the GUI, they are always placed relative to the current GUI size, which could be different from the starting GUI size, if the GUI was updated and the application resolution is different from the default GUI size. +GUI Scaling: The wiGUI is created with a default size of the application window size, so by default, placing elements (widgets) onto the GUI will be relative to this resolution. This can be modified by calling the `wiGUI::SetDesignSize()` function. +When the GUI is updated (usually done by [RenderPath2D](#renderpath2d) automatically), the GUI size will take the current screen size, and scale the contents accordingly. When the application window is resized, the GUI scaling will take effect automatically. When adding widgets to the GUI, they are always placed relative to the current GUI size, which could be different from the design GUI size, if the GUI was updated and the application resolution is different from the design GUI size. ### wiEventArgs [[Header]](../WickedEngine/wiWidget.h) [[Cpp]](../WickedEngine/wiWidget.cpp) diff --git a/Editor/CameraWindow.cpp b/Editor/CameraWindow.cpp index a66bec60f..730a480fd 100644 --- a/Editor/CameraWindow.cpp +++ b/Editor/CameraWindow.cpp @@ -137,7 +137,7 @@ CameraWindow::CameraWindow(wiGUI* gui) :GUI(gui) SetEntity(INVALID_ENTITY); - cameraWindow->Translate(XMFLOAT3(gui->GetSize().x - 720, 500, 0)); + cameraWindow->Translate(XMFLOAT3((float)wiRenderer::GetDevice()->GetScreenWidth() - 720, 500, 0)); cameraWindow->SetVisible(false); } diff --git a/Editor/Editor.cpp b/Editor/Editor.cpp index 6e5df68f7..2d0edb1b5 100644 --- a/Editor/Editor.cpp +++ b/Editor/Editor.cpp @@ -216,7 +216,6 @@ void EditorComponent::Load() float screenW = (float)wiRenderer::GetDevice()->GetScreenWidth(); float screenH = (float)wiRenderer::GetDevice()->GetScreenHeight(); - GetGUI().SetSize(screenW, screenH); XMFLOAT2 option_size = XMFLOAT2(100, 28); float step = (option_size.y + 5) * -1, x = screenW - option_size.x, y = screenH - option_size.y; @@ -2190,52 +2189,21 @@ void EditorComponent::EndTranslate() Scene& scene = wiScene::GetScene(); + scene.Component_DetachChildren(translator.entityID); + // Remove translator from scene: scene.Entity_Remove(translator.entityID); - // Translation ended, apply all final transformations as local pose: - for (size_t i = 0; i < scene.hierarchy.GetCount(); ++i) - { - HierarchyComponent& parent = scene.hierarchy[i]; - - if (parent.parentID == translator.entityID) // only to entities that were attached to translator! - { - Entity entity = scene.hierarchy.GetEntity(i); - TransformComponent* transform = scene.transforms.GetComponent(entity); - if (transform != nullptr) - { - transform->ApplyTransform(); // (**) - } - } - } - - // Restore scene hierarchy from before translation: - scene.hierarchy.Copy(savedHierarchy); - - // If an attached entity got moved, then the world transform was applied to it (**), - // so we need to reattach it properly to the parent matrix: + // Restore parents before selections were attached to translator: for (const wiScene::PickResult& x : selected) { - HierarchyComponent* parent = scene.hierarchy.GetComponent(x.entity); - if (parent != nullptr) + HierarchyComponent* hierarchy_prev = savedHierarchy.GetComponent(x.entity); + if (hierarchy_prev != nullptr) { - TransformComponent* transform_parent = scene.transforms.GetComponent(parent->parentID); - if (transform_parent != nullptr) - { - // Save the parent's inverse worldmatrix: - XMStoreFloat4x4(&parent->world_parent_inverse_bind, XMMatrixInverse(nullptr, XMLoadFloat4x4(&transform_parent->world))); - - TransformComponent* transform_child = scene.transforms.GetComponent(x.entity); - if (transform_child != nullptr) - { - // Child updated immediately, to that it can be immediately attached to afterwards: - transform_child->UpdateTransform_Parented(*transform_parent, parent->world_parent_inverse_bind); - } - } - + scene.Component_Attach(x.entity, hierarchy_prev->parentID); } } - + savedHierarchy.Clear(); selected.clear(); } void EditorComponent::AddSelected(const wiScene::PickResult& picked) diff --git a/Editor/ForceFieldWindow.cpp b/Editor/ForceFieldWindow.cpp index 64f991d61..dff490e4d 100644 --- a/Editor/ForceFieldWindow.cpp +++ b/Editor/ForceFieldWindow.cpp @@ -107,7 +107,7 @@ ForceFieldWindow::ForceFieldWindow(wiGUI* gui) : GUI(gui) - forceFieldWindow->Translate(XMFLOAT3(gui->GetSize().x - 720, 50, 0)); + forceFieldWindow->Translate(XMFLOAT3((float)wiRenderer::GetDevice()->GetScreenWidth() - 720, 50, 0)); forceFieldWindow->SetVisible(false); SetEntity(INVALID_ENTITY); diff --git a/Editor/MaterialWindow.cpp b/Editor/MaterialWindow.cpp index 7dd7b81b1..91bd70bd2 100644 --- a/Editor/MaterialWindow.cpp +++ b/Editor/MaterialWindow.cpp @@ -750,7 +750,7 @@ MaterialWindow::MaterialWindow(wiGUI* gui) : GUI(gui) materialWindow->AddWidget(texture_occlusion_uvset_Field); - materialWindow->Translate(XMFLOAT3(gui->GetSize().x - 880, 120, 0)); + materialWindow->Translate(XMFLOAT3((float)wiRenderer::GetDevice()->GetScreenWidth() - 880, 120, 0)); materialWindow->SetVisible(false); SetEntity(INVALID_ENTITY); diff --git a/Editor/MeshWindow.cpp b/Editor/MeshWindow.cpp index 9913056d2..b5bb87bfa 100644 --- a/Editor/MeshWindow.cpp +++ b/Editor/MeshWindow.cpp @@ -220,7 +220,7 @@ MeshWindow::MeshWindow(wiGUI* gui) : GUI(gui) - meshWindow->Translate(XMFLOAT3(gui->GetSize().x - 910, 520, 0)); + meshWindow->Translate(XMFLOAT3((float)wiRenderer::GetDevice()->GetScreenWidth() - 910, 520, 0)); meshWindow->SetVisible(false); SetEntity(INVALID_ENTITY); diff --git a/Editor/ModelImporter_GLTF.cpp b/Editor/ModelImporter_GLTF.cpp index b7d62bc2f..0bba82f9e 100644 --- a/Editor/ModelImporter_GLTF.cpp +++ b/Editor/ModelImporter_GLTF.cpp @@ -204,7 +204,7 @@ void LoadNode(int nodeIndex, Entity parent, LoaderState& state) Entity objectEntity = scene.Entity_CreateObject(node.name); ObjectComponent& object = *scene.objects.GetComponent(objectEntity); object.meshID = scene.meshes.GetEntity(node.mesh); - scene.Component_Attach(objectEntity, entity); + scene.Component_Attach(objectEntity, entity, true); } else { @@ -270,14 +270,11 @@ void LoadNode(int nodeIndex, Entity parent, LoaderState& state) transform.ApplyTransform(); // this creates S, R, T vectors from world matrix } - // Important: - // Do NOT call UpdateTransform, because Attach will query parent world matrix, and invert it for bind matrix - // But here we load everything in bind space (relative to parent) already, so it must be IDENTITY! - transform.world = IDENTITYMATRIX; + transform.UpdateTransform(); if (parent != INVALID_ENTITY) { - scene.Component_Attach(entity, parent); + scene.Component_Attach(entity, parent, true); } if (!node.children.empty()) diff --git a/Editor/ObjectWindow.cpp b/Editor/ObjectWindow.cpp index 2c25cc232..ac924a7e8 100644 --- a/Editor/ObjectWindow.cpp +++ b/Editor/ObjectWindow.cpp @@ -570,7 +570,7 @@ ObjectWindow::ObjectWindow(EditorComponent* editor) : editor(editor) - objectWindow->Translate(XMFLOAT3(GUI->GetSize().x - 720, 120, 0)); + objectWindow->Translate(XMFLOAT3((float)wiRenderer::GetDevice()->GetScreenWidth() - 720, 120, 0)); objectWindow->SetVisible(false); SetEntity(INVALID_ENTITY); diff --git a/Editor/PostprocessWindow.cpp b/Editor/PostprocessWindow.cpp index 60a9e7fa2..0bbec917a 100644 --- a/Editor/PostprocessWindow.cpp +++ b/Editor/PostprocessWindow.cpp @@ -332,7 +332,7 @@ PostprocessWindow::PostprocessWindow(wiGUI* gui, RenderPath3D* comp) : GUI(gui), ppWindow->AddWidget(chromaticaberrationSlider); - ppWindow->Translate(XMFLOAT3(gui->GetSize().x - 550, 50, 0)); + ppWindow->Translate(XMFLOAT3((float)wiRenderer::GetDevice()->GetScreenWidth() - 550, 50, 0)); ppWindow->SetVisible(false); } diff --git a/Tests/Tests.cpp b/Tests/Tests.cpp index b913b394c..28b7f3857 100644 --- a/Tests/Tests.cpp +++ b/Tests/Tests.cpp @@ -31,7 +31,6 @@ void TestsRenderer::Load() float screenW = (float)wiRenderer::GetDevice()->GetScreenWidth(); float screenH = (float)wiRenderer::GetDevice()->GetScreenHeight(); - GetGUI().SetSize(screenW, screenH); wiLabel* label = new wiLabel("Label1"); label->SetText("Wicked Engine Test Framework"); diff --git a/WickedEngine/ArchiveVersionHistory.txt b/WickedEngine/ArchiveVersionHistory.txt index f997b1e0a..7e2852f80 100644 --- a/WickedEngine/ArchiveVersionHistory.txt +++ b/WickedEngine/ArchiveVersionHistory.txt @@ -1,5 +1,6 @@ This file contains changelog of wiArchive versions +36: Removed HierarchyComponent::world_parent_inverse_bind 35: Roughness remapped to corrected brdf 34: Removed restPose from SoftBodyPhysicsComponent 33: LightComponent shadow bias behaviour changed diff --git a/WickedEngine/wiArchive.cpp b/WickedEngine/wiArchive.cpp index c81b79420..e55c8d882 100644 --- a/WickedEngine/wiArchive.cpp +++ b/WickedEngine/wiArchive.cpp @@ -7,7 +7,7 @@ using namespace std; // this should always be only INCREMENTED and only if a new serialization is implemeted somewhere! -uint64_t __archiveVersion = 35; +uint64_t __archiveVersion = 36; // this is the version number of which below the archive is not compatible with the current version uint64_t __archiveVersionBarrier = 22; diff --git a/WickedEngine/wiGUI.cpp b/WickedEngine/wiGUI.cpp index da7e3ed5c..608e1ecab 100644 --- a/WickedEngine/wiGUI.cpp +++ b/WickedEngine/wiGUI.cpp @@ -12,7 +12,11 @@ void wiGUIElement::AttachTo(wiGUIElement* parent) this->parent = parent; this->parent->UpdateTransform(); - XMStoreFloat4x4(&world_parent_bind, XMMatrixInverse(nullptr, XMLoadFloat4x4(&parent->world))); + XMMATRIX B = XMMatrixInverse(nullptr, XMLoadFloat4x4(&parent->world)); + + MatrixTransform(B); + UpdateTransform(); + UpdateTransform_Parented(*parent); } void wiGUIElement::Detach() { @@ -66,7 +70,15 @@ void wiGUI::Update(float dt) return; } - SetSize((float)wiRenderer::GetDevice()->GetScreenWidth(), (float)wiRenderer::GetDevice()->GetScreenHeight()); + XMFLOAT2 size_screen = XMFLOAT2((float)wiRenderer::GetDevice()->GetScreenWidth(), (float)wiRenderer::GetDevice()->GetScreenHeight()); + if (size_design.x == 0 || size_design.y == 0) + { + size_design = size_screen; + } + scale_local.x = size_screen.x / size_design.x; + scale_local.y = size_screen.y / size_design.y; + SetDirty(); + UpdateTransform(); XMFLOAT4 _p = wiInput::GetPointer(); pointerpos.x = _p.x; diff --git a/WickedEngine/wiGUI.h b/WickedEngine/wiGUI.h index 41aa1826e..3616d41f7 100644 --- a/WickedEngine/wiGUI.h +++ b/WickedEngine/wiGUI.h @@ -17,7 +17,6 @@ public: wiGraphics::Rect scissorRect; wiGUIElement* parent = nullptr; - XMFLOAT4X4 world_parent_bind = IDENTITYMATRIX; void AttachTo(wiGUIElement* parent); void Detach(); }; @@ -31,11 +30,8 @@ private: bool focus = false; bool visible = true; XMFLOAT2 pointerpos = XMFLOAT2(0, 0); + XMFLOAT2 size_design = XMFLOAT2(0, 0); public: - wiGUI() - { - SetSize(1920, 1080); // default size - } ~wiGUI(); void Update(float dt); @@ -57,14 +53,8 @@ public: void SetVisible(bool value) { visible = value; } bool IsVisible() { return visible; } - XMFLOAT2 GetSize() const { return XMFLOAT2(scale_local.x, scale_local.y); } - void SetSize(float width, float height) - { - SetDirty(); - scale_local.x = width; - scale_local.y = height; - UpdateTransform(); - } + void SetDesignSize(float width, float height) { size_design = XMFLOAT2(width, height); } + const XMFLOAT2& GetDesignSize() const { return size_design; } const XMFLOAT2& GetPointerPos() const { diff --git a/WickedEngine/wiScene.cpp b/WickedEngine/wiScene.cpp index f628aba52..9e161223b 100644 --- a/WickedEngine/wiScene.cpp +++ b/WickedEngine/wiScene.cpp @@ -70,14 +70,13 @@ namespace wiScene XMStoreFloat4x4(&world, GetLocalMatrix()); } } - void TransformComponent::UpdateTransform_Parented(const TransformComponent& parent, const XMFLOAT4X4& inverseParentBindMatrix) + void TransformComponent::UpdateTransform_Parented(const TransformComponent& parent) { - SetDirty(); + //SetDirty(); XMMATRIX W = GetLocalMatrix(); XMMATRIX W_parent = XMLoadFloat4x4(&parent.world); - XMMATRIX B = XMLoadFloat4x4(&inverseParentBindMatrix); - W = W * B * W_parent; + W = W * W_parent; XMStoreFloat4x4(&world, W); } @@ -1395,7 +1394,7 @@ namespace wiScene return entity; } - void Scene::Component_Attach(Entity entity, Entity parent) + void Scene::Component_Attach(Entity entity, Entity parent, bool child_already_in_local_space) { assert(entity != parent); @@ -1437,14 +1436,20 @@ namespace wiScene { transform_parent = &transforms.Create(parent); } - // Save the parent's inverse worldmatrix: - XMStoreFloat4x4(&parentcomponent.world_parent_inverse_bind, XMMatrixInverse(nullptr, XMLoadFloat4x4(&transform_parent->world))); TransformComponent* transform_child = transforms.GetComponent(entity); if (transform_child == nullptr) { - transform_child = &transforms.Create(entity); + transform_child = &transforms.Create(entity); + transform_parent = transforms.GetComponent(parent); // after transforms.Create(), transform_parent pointer could have become invalidated! } + if (!child_already_in_local_space) + { + XMMATRIX B = XMMatrixInverse(nullptr, XMLoadFloat4x4(&transform_parent->world)); + transform_child->MatrixTransform(B); + transform_child->UpdateTransform(); + } + transform_child->UpdateTransform_Parented(*transform_parent); LayerComponent* layer_parent = layers.GetComponent(parent); if (layer_parent == nullptr) @@ -1666,7 +1671,7 @@ namespace wiScene TransformComponent* transform_parent = transforms.GetComponent(parentcomponent.parentID); if (transform_child != nullptr && transform_parent != nullptr) { - transform_child->UpdateTransform_Parented(*transform_parent, parentcomponent.world_parent_inverse_bind); + transform_child->UpdateTransform_Parented(*transform_parent); } diff --git a/WickedEngine/wiScene.h b/WickedEngine/wiScene.h index d46756754..cfb56e4bc 100644 --- a/WickedEngine/wiScene.h +++ b/WickedEngine/wiScene.h @@ -68,7 +68,7 @@ namespace wiScene XMVECTOR GetScaleV() const; XMMATRIX GetLocalMatrix() const; void UpdateTransform(); - void UpdateTransform_Parented(const TransformComponent& parent, const XMFLOAT4X4& inverseParentBindMatrix = IDENTITYMATRIX); + void UpdateTransform_Parented(const TransformComponent& parent); void ApplyTransform(); void ClearTransform(); void Translate(const XMFLOAT3& value); @@ -95,7 +95,6 @@ namespace wiScene { wiECS::Entity parentID = wiECS::INVALID_ENTITY; uint32_t layerMask_bind; // saved child layermask at the time of binding - XMFLOAT4X4 world_parent_inverse_bind; // saved parent inverse worldmatrix at the time of binding void Serialize(wiArchive& archive, uint32_t seed = 0); }; @@ -1090,7 +1089,8 @@ namespace wiScene ); // Attaches an entity to a parent: - void Component_Attach(wiECS::Entity entity, wiECS::Entity parent); + // child_already_in_local_space : child won't be transformed from world space to local space + void Component_Attach(wiECS::Entity entity, wiECS::Entity parent, bool child_already_in_local_space = false); // Detaches the entity from its parent (if it is attached): void Component_Detach(wiECS::Entity entity); // Detaches all children from an entity (if there are any): diff --git a/WickedEngine/wiScene_Serializers.cpp b/WickedEngine/wiScene_Serializers.cpp index d2576d6a6..2a673bc43 100644 --- a/WickedEngine/wiScene_Serializers.cpp +++ b/WickedEngine/wiScene_Serializers.cpp @@ -63,12 +63,15 @@ namespace wiScene if (archive.IsReadMode()) { archive >> layerMask_bind; - archive >> world_parent_inverse_bind; + if (archive.GetVersion() < 36) + { + XMFLOAT4X4 world_parent_inverse_bind; + archive >> world_parent_inverse_bind; + } } else { archive << layerMask_bind; - archive << world_parent_inverse_bind; } } void MaterialComponent::Serialize(wiArchive& archive, uint32_t seed) diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp index 6cbf8b807..dcf1facb1 100644 --- a/WickedEngine/wiVersion.cpp +++ b/WickedEngine/wiVersion.cpp @@ -9,7 +9,7 @@ namespace wiVersion // minor features, major updates const int minor = 38; // minor bug fixes, alterations, refactors, updates - const int revision = 6; + const int revision = 7; long GetVersion() diff --git a/WickedEngine/wiWidget.cpp b/WickedEngine/wiWidget.cpp index aa5331b83..1eba3f0e1 100644 --- a/WickedEngine/wiWidget.cpp +++ b/WickedEngine/wiWidget.cpp @@ -39,7 +39,7 @@ void wiWidget::Update(wiGUI* gui, float dt) if (parent != nullptr) { - this->UpdateTransform_Parented(*parent, world_parent_bind); + this->UpdateTransform_Parented(*parent); } XMVECTOR S, R, T; @@ -1365,12 +1365,15 @@ wiWindow::wiWindow(wiGUI* gui, const std::string& name, bool window_controls) : moveDragger->SetSize(XMFLOAT2(scale.x - windowcontrolSize * 3, windowcontrolSize)); moveDragger->SetPos(XMFLOAT2(windowcontrolSize, 0)); moveDragger->OnDrag([this, gui](wiEventArgs args) { + auto saved_parent = this->parent; + this->Detach(); this->Translate(XMFLOAT3(args.deltaPos.x, args.deltaPos.y, 0)); this->wiWidget::Update(gui, 0); for (auto& x : this->childrenWidgets) { x->wiWidget::Update(gui, 0); } + this->AttachTo(saved_parent); }); AddWidget(moveDragger); @@ -1402,6 +1405,8 @@ wiWindow::wiWindow(wiGUI* gui, const std::string& name, bool window_controls) : resizeDragger_UpperLeft->SetSize(XMFLOAT2(windowcontrolSize, windowcontrolSize)); resizeDragger_UpperLeft->SetPos(XMFLOAT2(0, 0)); resizeDragger_UpperLeft->OnDrag([this, gui](wiEventArgs args) { + auto saved_parent = this->parent; + this->Detach(); XMFLOAT2 scaleDiff; scaleDiff.x = (scale.x - args.deltaPos.x) / scale.x; scaleDiff.y = (scale.y - args.deltaPos.y) / scale.y; @@ -1412,6 +1417,7 @@ wiWindow::wiWindow(wiGUI* gui, const std::string& name, bool window_controls) : { x->wiWidget::Update(gui, 0); } + this->AttachTo(saved_parent); }); AddWidget(resizeDragger_UpperLeft); @@ -1421,6 +1427,8 @@ wiWindow::wiWindow(wiGUI* gui, const std::string& name, bool window_controls) : resizeDragger_BottomRight->SetSize(XMFLOAT2(windowcontrolSize, windowcontrolSize)); resizeDragger_BottomRight->SetPos(XMFLOAT2(translation.x + scale.x - windowcontrolSize, translation.y + scale.y - windowcontrolSize)); resizeDragger_BottomRight->OnDrag([this, gui](wiEventArgs args) { + auto saved_parent = this->parent; + this->Detach(); XMFLOAT2 scaleDiff; scaleDiff.x = (scale.x + args.deltaPos.x) / scale.x; scaleDiff.y = (scale.y + args.deltaPos.y) / scale.y; @@ -1430,6 +1438,7 @@ wiWindow::wiWindow(wiGUI* gui, const std::string& name, bool window_controls) : { x->wiWidget::Update(gui, 0); } + this->AttachTo(saved_parent); }); AddWidget(resizeDragger_BottomRight); } diff --git a/models/Havoc/havoc.wiscene b/models/Havoc/havoc.wiscene index 4ab34cea3387405bde70f845ba0ccdedcdab01dc..99bd7ea86fa5d850344ba98339de4c08f4f7891f 100644 GIT binary patch delta 101044 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 delta 101767 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 G&HNvpoc99& diff --git a/models/girl.wiscene b/models/girl.wiscene index 9d73b287e078c9413c1bcaeb31c1b2a370ae4c22..ac875437c072a2e5f64df57997f1953ce532f7c5 100644 GIT binary patch delta 3337 zcmchZYiL|W6vyYz-pxL;?d~RbvwdvhrsiQNskX#wg>=^#OA|;`T4T_}CN+z$#w09( z22t16FZF{Gaz9*x1>0g31;r+s_-YdKMJ*{PXpM+8AUDW zbAR)nz4y+X|2eZGW4<#l`@$7$`Bi>AeBQ_w>%lv^A5Uev_uQ39r}_rF2h;t1%&nz# zPj4y*`?`A{V*#zCdeVdanH~L^hf=KgSYHbbyFK4}DZ0+3DX`NI)D=+dJl*s##o5JQ zDX@JVJx?%}Wvt;~Lpu$W+&XbL#km7^jAGMQ10jkv8;wSaq2bN~HzeDOj5cJ;JcXP}&$M$A5E9<^)T0sE{k?6g_D$c`79 z<1_Bp4f}m>Aa-i8u)gEV;q8wu4JHo0)>XfFWOVAl&{CrF_aCOmM?AZE@Vt5RG;I!D z;@-K(;!%6aEXzJ$`Bp-VJ%ioDZeF8ZOkJIc#25bOUCeS?ytq_d{AFipNimKs_(NPY z4_g4n)`0VMlo@oCo91k;?l1xM2Sy!&^L5lEbkrvpbqZeod(j9`xR`(f2IsE;1q~gA z4VDEib_$&Td(^ws#rt!Gj~}1`fb&y;hVXYfQh?MTwfGREfI1$%|Jt-X@tzgjT60w` zFIV*AKNo*!1TO9Q&yGbV$0A0@FL8|0is%}W?N;5>R@gU1tjPw>e=0TUuy8iT`3)QM zj|(-OF_eWz4~Tir?d?43EW~-$D(2F|bjpb5Mw~NoUVZOnMTDnpdV1UR;g3$9s2(~t zHL>=V#GwyfOnyJRKe4%b*Yw0A=|o`9jWeU4jZA%N>`gBCf2&8v=xnjWZp&$H=b@}T zR>X@}$|HRboQ;b4r;`iDhvBbyVlh^^QvNPW-(>R!9&np-!{wK^8D8hXTJBxL*p@rl z;jzY3b942K?QHxe*p#3%Ew@1H6TPd9#b+6tNl@CQI#tc@D;}w6*oyh#X3m^s zn^EEeyTsh6AE&yhRj^yC*s%hwf<02jK6(?r{P^#!k0j+{pNfkY6wN}AF zsiI?rvIUaDw%F|C42 zrHaBY(<=BnsiGmqwF)L@ME&?%v_Y%j>!pfbS)o;MrBv}3s!FLQv2$`8k2$T{me%Cz zT0ZYF$u;&7E2eISEm3k}h7We(@^K)Sei`gyN)_bRD(q4qRgg!kunX09)DQA$6-o7z z>H{fjA*HYuSXm1x)zJ$Lr|6VCScohez0JaQ4=OBuHrY7{l?sN1Ok)Kt_}Dy}F~Sy8jQzHwuH z<1>}YU{CF0x~+XV;-uJr>|2fE&X(N06hEohmrAj`eZw}2wvrQ7jL)W(QyjZ`#Y^$S zw*B!GuNli*U!;q-n)cOG>}zj$fZ~LsM z^x#o$xTUmc4`F@7cTZA0+50HJV5Yb>cf@^TV5*-TD7>2*{Ou|KKQn&fUr%|q8DF2F znWMgL7O2^dMfyCw?+3Ntwq$b3&}>RDB2Fzcxk+msE*j|hQ5^_)TLPDS2M61_#sY@_ zvex%;{8qbpPW2iWS9h~AkRGJ#7NyDf&&s%2npj?61U0M@>P0!GywcB&r{z7W3AIy%9Sw;Pq`p`|SS}bJ z(}jRpt%m4@B0`9_a-+!=&sUJQ*o}s4x9@7wkj*u7b8R{037_)V%74nmT^fUq<}?}U zmu4R>oU~15J7`A^6=v9%EQ{Tf(Hw@w8?U%Y?LwlnH`F1zx#FVjXe*z-Z6L9*H;l4; ze{n=5pg!h+(wT#UW-teo$s8;+i#ecd=J4^D!yM2e z=3t_^%mL*w2N%7aIiNe3gI*Rh2b9koEaFb$9E3uj-)GMvg@m^I?cT7*Z~rQut!~sTx#D zss>1^2HKOV0g|eL_M~cnq-vl&sTv@u8fZ_d21u#~-XT>(C@fS{k>kQ&82U>i@=0#u zG>^NJ#K)-5eAk_7oF9ESfKyRM)+x%~^-+6P9^3Rv@%hnF`cRs29M{>Su^A{2uIudR v2v9#Uj@H?cExmsC}~DXtY|ct~IK`@{r~v_w}w&3kd%Ox7Wxi